gpt4 book ai didi

python - Python 中的优化——该做的、不该做的和经验法则

转载 作者:太空狗 更新时间:2023-10-29 20:36:57 27 4
gpt4 key购买 nike

嗯,我正在读这个post然后我遇到了一个代码:

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

我认为在列表理解之外计算 len(jokes) 的值不是更好吗?

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

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(jokes)=1000000)?

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

开发人员在 Python 中优化的经验法则是什么

Edit1:由于大多数答案都是“不要优化,如果速度慢,稍后再做”,我从 Triptych 那里得到了一些提示和链接>Ali A 代表做的事情。我将稍微更改一下问题并请求不要

我们能否从面临“缓慢”的人那里得到一些经验,问题是什么以及如何纠正?

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

Edit3: 有问题的 timeit 用法不正确,请参阅 dF 的 答案以了解正确用法以及三个代码的计时。

最佳答案

您没有使用 timeit正确:-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. 分析您的代码(profile / cProfile and pstats 是您的 friend )以找出您需要优化的内容(通常是紧循环之类的东西)。

  3. 作为最后的手段,将这些重新实现为 C 扩展,使用 pyrex 等工具可以更轻松地实现这些和 cython .

需要注意的一件事:与许多其他语言相比,函数调用在 Python 中相对昂贵,这就是为什么即使 len 为 O(1),您的示例中的优化也有所不同列表。

关于python - Python 中的优化——该做的、不该做的和经验法则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/403794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com