是否有内置(或只是优化)的python功能可以在两个单独的变量中同时获得分区和余数?
示例:
a, b = 10 divided by 4
期望的结果:
a = 2
b = 2
我需要这是一个优化的解决方案。
效果结果:
第一段代码:
for i in range(10000000):
a, b = divmod(i, 5)
took 3.99 seconds to run
第二段代码:
for i in range(10000000):
a = i // 5
b = i % 5
took 2.56 seconds to run
说明:
阅读@casevh答案以获得更详细的解释。
tldr:如果数字很大,divmod()效果会更好。
答案 0 :(得分:10)
使用它。这对你有帮助。
a,b = divmod(10,2)
它将返回两个值
答案 1 :(得分:4)
答案 2 :(得分:3)
如果使用更大的数字,性能会有显着差异。
以下是使用小数和大数的示例:
$ py27 -m timeit -s "a=123;b=7" "divmod(a,b)"
10000000 loops, best of 3: 0.0913 usec per loop
$ py27 -m timeit -s "a=123;b=7" "a//b;a%b"
10000000 loops, best of 3: 0.047 usec per loop
$ py27 -m timeit -s "a=123333333333333333333333333333333333333;b=7222222222222222222" "divmod(a,b)"
10000000 loops, best of 3: 0.165 usec per loop
$ py27 -m timeit -s "a=123333333333333333333333333333333333333;b=7222222222222222222" "a//b;a%b"
1000000 loops, best of 3: 0.232 usec per loop
为何与众不同?
divmod()需要函数调用,而//和%是运算符。函数调用相对于运算符有额外的开销。因此,当计算成本最小时,调用函数的开销远大于计算的实际成本。
对于较大的数字,divmod()更快。 divmod()同时计算商和余数,并返回它们。 //和%运算符分别计算商和余数,但只返回其中一个结果。
divmod()有更多的开销但只执行一次除法。 //和%有更少的开销,但执行两个分区。只要与执行除法的时间相比开销很大,divmod()就会变慢。但是一旦除法的成本大于开销,divmod()就会更快。