Dro*_*ans 5 python computer-science
我正在进行寻找素数的(典型)任务.我以为我会很聪明,而且对于大量的人来说,用这个技巧跳过分裂过程:
def div5(candidate):
return str(candidate)[-1] == "5"
Run Code Online (Sandbox Code Playgroud)
添加5到自身几千次似乎是浪费(我只需要最后一个成员),但我想确定.
%>python -mtimeit -s"import intDiv" "intDiv.div5(2147483645)"
1000000 loops, best of 3: 0.272 usec per loop
%>python -mtimeit -s"import strDiv" "strDiv.str5(2147483645)"
1000000 loops, best of 3: 0.582 usec per loop
Run Code Online (Sandbox Code Playgroud)
为了澄清,这里是我定义的两种方法.
def div5(maxi): return not (maxi%5)
Run Code Online (Sandbox Code Playgroud)
def str5(maxi): return str(maxi)[-1] == '5'
Run Code Online (Sandbox Code Playgroud)
这太慢了.如何在不转换整数(不必要)的情况下分析str(maxi)的最后一个成员?
感谢@ Claudiu帮助清理眼睛.
Woo*_*ble 10
% python -mtimeit "str(2147483645)"
1000000 loops, best of 3: 0.321 usec per loop
% python -mtimeit "2147483645 % 5"
10000000 loops, best of 3: 0.0351 usec per loop
% python -mtimeit "'2147483645'[-1]"
10000000 loops, best of 3: 0.0349 usec per loop
Run Code Online (Sandbox Code Playgroud)
我想说瓶颈是转换为字符串.
一个问题是将整数转换为字符串.这比做整数除法要多得多.我不确定Python是如何做到的,但大多数算法都是这样的
def tostring(value):
result = ""
while True:
digit = value % 10
value = value / 10
result = chr(digit + ord('0')) + result
if value == 0: break
return result
Run Code Online (Sandbox Code Playgroud)
也就是说,每个模块操作不止一个value.