Python中的优化-do's,don'ts和rules of thumb

2024-05-19 10:22:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读这个post的时候,发现一个代码是:

jokes=range(1000000)
domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]

我想,在列表理解之外计算len(笑话)的值不是更好吗?

好吧,我试过了,计时了三个代码

jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]'
10000000 loops, best of 3: 0.0352 usec per loop
jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);l=len(jokes);domain=[(0,(l*2)-i-1) for i in range(0,l*2)]'
10000000 loops, best of 3: 0.0343 usec per loop
jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);l=len(jokes)*2;domain=[(0,l-i-1) for i in range(0,l)]'
10000000 loops, best of 3: 0.0333 usec per loop

观察第一个和第二个之间2.55%的边际差异使我认为-是第一个列表理解

domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]

由python内部优化?或者2.55%是足够大的优化(假设len(笑话)=1000000)?

如果这是-Python中的其他隐式/内部优化是什么?

什么是developer's rules of thumb for optimization in Python

Edit1:由于大多数答案都是“不优化,如果速度慢,请稍后再做”,我从TriptychAli A获得了一些提示和链接。 我会把问题改一点,并要求不要这样做。

我们能从那些面临“慢”的人那里得到一些经验吗?问题是什么?是如何解决的?

Edit2:对于那些还没有到这里的人来说,是一个interesting read

Edit3:有关timeit的不正确用法,请参见dF的正确用法的答案,以及三个代码的计时。


Tags: of代码inforlendomainrangebest
3条回答

读这个:Python Speed / Performance Tips

另外,在您的示例中,总时间非常短,以至于误差范围将超过速度上的任何实际差异。

您没有正确地使用^{}-s(setup)的参数是一个最初要执行一次的语句,因此您实际上只是在测试一个空语句。你想这么做

$ python -m timeit -s "jokes=range(1000000)" "domain=[(0,(len(jokes)*2)-i-1) for i in range(0, len(jokes)*2)]"
10 loops, best of 3: 1.08 sec per loop
$ python -m timeit -s "jokes=range(1000000)" "l=len(jokes);domain=[(0,(l*2)-i-1) for i in range(0, l*2)]"
10 loops, best of 3: 908 msec per loop
$ python -m timeit -s "jokes=range(1000000)" "l=len(jokes*2);domain=[(0,l-i-1) for i in range(0, l)]"
10 loops, best of 3: 813 msec per loop

虽然提速仍不显著,但更为显著(分别为16%和25%)。因此,由于它不会使代码变得更复杂,所以这种简单的优化可能是值得的。

为了解决实际问题。。。Python中通常的经验法则是

  1. 在编码时,更倾向于直接易读的代码而不是优化。

  2. 分析您的代码(^{} and ^{}是您的朋友)以找出需要优化的内容(通常是像紧循环这样的东西)。

  3. 最后,将它们重新实现为C扩展,这对于像pyrexcython这样的工具来说要容易得多。

需要注意的一点是:与许多其他语言相比,函数调用在Python中相对昂贵,这就是为什么示例中的优化产生了影响,尽管len对于列表来说是O(1)。

这适用于所有编程,而不仅仅是Python:

  1. 剖面图
  2. 确定瓶颈
  3. 优化

我甚至补充说,除非你有一个导致疼痛的缓慢问题,否则不要费心做任何事情。

也许最重要的是单元测试将在实际过程中帮助您。

相关问题 更多 >

    热门问题