2012-07-22 43 views
1

我最近试图在python中运行一个Project Euler问题。我相信它会做100 + 5步。这个python基准有用吗?

看到我的解决方案笏时间太长(它应该是一分钟之内运行)后,我问自己,如果任何的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分钟左右的时间?

回答

1

对于python,它可能是一个很好的估计。使用numpy或C++扩展可能会加速您的Project Euler代码,但请记住Project Euler上的所有问题都可以在1分钟内解决<。为了达到正确的解决方案,您不太可能需要运行100^5次操作。如果我是你,我会尝试从另一个角度来处理这个问题。

+0

在C中,它运行了一分钟。 然后,看着答案,我看到一个小小的修改,似乎使事情快100倍。我会进一步研究它。谢谢,虽然 – josinalvo 2012-07-22 22:32:08

+0

没问题!很高兴我能帮上忙。 – 2012-07-23 22:26:27

0

在内循环中尝试pass而不是s=1

此外,使用带“external_loop”选项的numpy.nditer,或者如果循环变成瓶颈,则在Cython中编写循环。不应该

2

项目欧拉问题,一分钟之内运行,因为你的编程语言是不够,而是因为存在一个解决方案,它聪明不仅仅是蛮力。

但在你的情况下,是的,你会得到循环99^5倍(不100^5因为range(1,100)1, 2, ..., 99)函数...

2

这是一个合理的假设,但我不知道它是做你想要什么。在现实生活中,这可能更接近:

for i in xrange(100 ** 5): pass 
1

这是否证明有这么多步骤的程序总是需要20分钟左右?

取决于您对“step”的定义。这里是需要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