答案很简单,就是Python处理所有对象,并且默认情况下没有JIT。因此,不是通过修改堆栈上的几个字节并优化代码的较热部分(即迭代)来提高效率,而是与大量表示数字的对象一起使用Python突突,而没有即时优化。
如果您在具有JIT的Python变体中尝试过此操作(例如PyPy),我保证您会看到很大的不同。
一个一般性的技巧是避免使用标准的Python进行非常昂贵的操作(尤其是如果这是为后端处理来自多个客户端的请求)。带有JIT的Java,C#,JavaScript等效率更高。
顺便说一句,如果您想以更Python的方式编写示例,则可以这样做:
from datetime import datetime
start_time = datetime.Now()
max_number = 20
x = max_number
while True:
i = 2
while i <= max_number:
if x % i: break
i += 1
else:
# x was not divisible by 2...20
break
x += 1
print('number: %d' % x)
print('time elapsed: %d seconds' % (datetime.Now() - start_time).seconds)
上面对我执行了90秒。它之所以更快,是因为它看起来像愚蠢的东西,比如x
比短start
,这是因为我没有经常分配变量,而是依靠Python自己的控制结构,而不是依靠变量检查来跳入/跳出循环。