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

Dro*_*ans 5 python computer-science

我正在进行寻找素数的(典型)任务.我以为我会很聪明,而且对于大量的人来说,用这个技巧跳过分裂过程:

def div5(candidate):
    return str(candidate)[-1] == "5"
Run Code Online (Sandbox Code Playgroud)

添加5到自身几千次似乎是浪费(我只需要最后一个成员),但我想确定.

在Python中度过测量时间的信誉

%>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)

我想说瓶颈是转换为字符串.


roc*_*ker 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
Run Code Online (Sandbox Code Playgroud)

也就是说,每个模块操作不止一个value.