我是 Python 新手,我想我会在 Project Euler 上解决问题,同时做一些具体的事情。
我遇到了对不同解决方案进行计时的想法,以查看它们如何相互评价。然而,这个简单的任务对我来说太复杂了。我读到这些time.clock()
调用在 unix 系统上不够准确(秒分辨率对于现代处理器来说简直是可悲的)。因此,我偶然发现了该timeit
模块,它似乎是分析任务的首选。
我不得不说我真的不明白他们为什么要以这种违反直觉的方式去做。我似乎无法让它工作,而无需重写/重组我的代码,我觉得这非常令人沮丧。
看下面的代码,不要介意它既不漂亮也不特别有效:
import math
import sys
from timeit import Timer
def digitsum(number):
rem = 0
while number > 0:
rem += number % 10
number //= 10
return rem
def prime_form(p):
if p == 2 or p == 3 or p == 5:
return True
elif (p-1) % 6 != 0 and (p+1) % 6 != 0:
return False
elif digitsum(p) % 3 == 0:
return False
elif p % 10 == 0 or p % 10 == 5:
return False
else:
return True
def lfactor(n):
if n <= 3:
return 1
limit = int(math.sqrt(n))
if limit % 2 == 0:
limit -= 1
lfac = 1
for i in range(3,limit+1,2):
if prime_form(i):
(div,rem) = divmod(n,i)
if rem == 0:
lfac = max(lfac, max(lfactor(div) ,lfactor(i)))
return lfac if lfac != 1 else n
number = int(sys.argv[1])
t = Timer("""print lfactor(number)""", """import primefacs""")
t.timeit(100)
#print lfactor(number)
如果我想为这条线计时,print lfactor(number)
为什么我应该经历一堆循环,试图定义一个设置语句等。我理解为什么人们想要拥有与正在测试的代码分离的调试工具(la unit testing ) 但不应该有一种简单直接的方法来获得一大块代码的处理时间而没有太多麻烦(导入/定义设置等)吗?我在这里的想法类似于这样做的方式:
long t0 = System.currentTimeInMillis();
// do something
long t = System.currentTimeInMillis() - t0;
.. 使用 tic/toc 命令,使用 MATLAB 甚至更好:
tic
x = A\b;
t(n) = toc;
希望这不会让人觉得这是一种咆哮,我真的在努力理解“pythonian 的思维方式”,但老实说,这并不是自然而然的,根本不是......