今天,我们将讨论Python中的优化技术。在本文中,您将了解如何通过避免在列表和字典中进行重新计算来加快代码的速度。
我们先编写一个装饰器函数来计算函数的执行时间,方便测验不同代码的速度:
- import functools
- import time
- def timeit(func):
- @functools.wraps(func)
- def newfunc(*args, **kwargs):
- startTime = time.time()
- func(*args, **kwargs)
- elapsedTime = time.time() - startTime
- print('function - {}, took {} ms to complete'.format(func.__name__, int(elapsedTime * 1000)))
- return newfunc
一、避免在列表中重新评估
1. 在循环内
代码:
- @timeit
- def append_inside_loop(limit):
- nums = []
- for num in limit:
- nums.append(num)
- append_inside_loop(list(range(1, 9999999)))
在上面的函数中.append每次通过循环重新计算的函数引用。执行后,上述函数所花费的总时间:
- o/p - function - append_inside_loop, took 529 ms to complete
2. 在循环外
代码:
- @timeit
- def append_outside_loop(limit):
- nums = []
- append = nums.append
- for num in limit:
- append(num)
- append_outside_loop(list(range(1, 9999999)))
在上面的函数中,我们对nums.append在循环外部估值,并在循环内部使用append为变量。总时间:
- o/p - function - append_outside_loop, took 328 ms to complete
如您所见,当我们在for循环外部追加为一个本地变量,这将花费更少的时间,可以将代码加速201 ms。
二、避免在字典中重新求值
1. 在循环内部
代码:
- @timeit
- def inside_evaluation(limit):
- data = {}
- for num in limit:
- data[num] = data.get(num, 0) + 1
- inside_evaluation(list(range(1, 9999999)))
上述函数所花费的总时间:
- o/p - function - inside_evaluation, took 1400 ms to complete
2. 在循环外
代码:
- @timeit
- def outside_evaluation(limit):
- data = {}
- get = data.get
- for num in limit:
- data[num] = get(num, 0) + 1
- outside_evaluation(list(range(1, 9999999)))
上述函数所花费的总时间:
- o/p - function - outside_evaluation, took 1189 ms to complete
如你所见,我们这里的代码速度提高了211毫秒。
英文原文:https://dev.to/sharmapacific/speedup-python-list-and-dictionary-12kd