为什么大整数除法比切片(数字)字符串更快,用于访问个别数字?

时间:2011-09-19 17:06:12

标签: python computer-science

我正在进行寻找素数的(典型)任务。我认为我会很聪明,而对于大数字,我会跳过分裂过程:

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 帮助清理眼睛。

3 个答案:

答案 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整除。