我正在进行寻找素数的(典型)任务。我认为我会很聪明,而对于大数字,我会跳过分裂过程:
def div5(candidate):
return str(candidate)[-1] == "5"
为自己添加数千次似乎是浪费(我只需要最后一个成员),但我想确定。
对Measure time elapsed in Python?
的unutbu信用%>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
为了澄清,以下是我定义的两种方法。
def div5(maxi): return not (maxi%5)
def str5(maxi): return str(maxi)[-1] == '5'
这太慢了。如何在不转换整数(不必要)的情况下分析str(maxi)的最后一个成员?
感谢@ Claudiu 帮助清理眼睛。
答案 0 :(得分: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
我说瓶颈正在转换为字符串。
答案 1 :(得分:5)
一个问题是将整数转换为字符串。这比做整数除法要多得多。 我不确定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
那就是每个value
有多个模运算。
答案 2 :(得分:0)
将数字转换为字符串将如下所示:
digits = []
while x:
digits.append(x % 10)
x //= 10
你可以看到这将做很多%的操作(除了构造数字或字符串列表)。
除了此优化问题,您的功能不正确。例如,10不以5结尾,但可以被5整除。