暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

加速Python列表和字典,让你代码更加高效

Python学会 2020-05-20
203
介绍


今天,我们将讨论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


避免在列表中重新评估

.append在循环内



代码:


@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



.append在循环外


代码:


@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。

避免在字典中重新求值



在循环内部


代码:


@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




在循环外


代码:


@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毫秒。


原文请见文末原文链接。

·END·
 

关注我们

机器学习·数据分析


文章转载自Python学会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论