我最近尝试在python中运行Project Euler问题。我相信它会做100 ^ 5步骤。
在看到我的解决方案需要花费太长时间(它应该在一分钟内运行)后,我问自己任何运行这么多步骤的 python程序是否可行(在一分钟之内)
所以,我设计了一个愚蠢的小测试
def fun():
l=range(1,100)
for x in l:
for y in l:
for k in l:
for n in l:
for h in l:
s=1
>>> t = timeit.Timer('demorado.fun()','import demorado')
>>> t.timeit(1)
1202.484529018402
>>>
有意义吗?是否证明任何具有这么多步骤的程序(在这种情况下,我猜有2 *(100 ^ 5))总是需要20分钟?
答案 0 :(得分:2)
项目Euler问题不应该在一分钟内运行,因为你的编程语言快足够,但因为存在一个更聪明的解决方案而不仅仅是暴力。
但是在你的情况下,是的,你会得到一个循环99^5
次的函数(不是100^5
,因为range(1,100)
是1, 2, ..., 99
)...
答案 1 :(得分:2)
这是一个合理的假设,虽然我不确定它是否正在做你想要的。在现实生活中,这可能更接近:
for i in xrange(100 ** 5): pass
答案 2 :(得分:1)
对于python,它可能是一个很好的估计。使用numpy或C ++扩展可能会加速Project Euler代码,但请记住Project Euler上的所有问题都可以在<1分钟内解决。您不太可能需要运行100 ^ 5个操作才能获得正确的解决方案。如果我是你,我会尝试从不同的角度解决问题。
答案 3 :(得分:1)
是否证明任何具有这么多步骤的程序总是需要20分钟?
取决于您对“步骤”的定义。这里的代码需要大约99 ^ 5个浮点运算,但运行时间约为1秒:
import numpy as np
a = np.zeros(shape=(1681, 1681), dtype=np.float32) # 1681 x 1681 matrix
b = np.dot(a, a) # matrix product
答案 4 :(得分:0)
在内循环中尝试pass
而不是s=1
。
另外,将numpy.nditer
与“external_loop”选项一起使用,或者如果循环结果是您的瓶颈,则在Cython中编写循环。