在2个单独的变量中同时获得Floor Division和Remainder

joa*_*avf 3 python optimization

是否有一个内置(或只是优化)的python功能,可以在两个单独的变量中同时获得分区和余数?

例:

a, b = 10 divided by 4
Run Code Online (Sandbox Code Playgroud)

期望的结果:

a = 2
b = 2
Run Code Online (Sandbox Code Playgroud)

我需要这个是一个优化的解决方案.

表现结果:

第一段代码:

for i in range(10000000):
    a, b = divmod(i, 5)
took 3.99 seconds to run
Run Code Online (Sandbox Code Playgroud)

第二段代码:

for i in range(10000000):
    a = i // 5
    b = i % 5
took 2.56 seconds to run
Run Code Online (Sandbox Code Playgroud)

备注:

阅读@casevh答案以获得更详细的解释.

tldr:如果数字很大,divmod()效果会更好.

Man*_*hav 11

用这个.这会对你有所帮助.

a,b = divmod(10,2)
Run Code Online (Sandbox Code Playgroud)

它将返回两个值


Anu*_*nuj 6

我想你正在寻找divmod()库函数

这是其文档链接

例子

>>> a, b = divmod(10, 4)
>>> print a, b
>>> 2 2
Run Code Online (Sandbox Code Playgroud)


cas*_*evh 5

如果使用更大的数字,性能会有显着差异。

这是一个同时使用小数和大数的示例:

$ 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
Run Code Online (Sandbox Code Playgroud)

为什么会有差异?

divmod() 需要函数调用,而 // 和 % 是运算符。与运算符相关的函数调用有额外的开销。因此,当计算成本最小时,调用函数的开销远大于计算的实际成本。

对于较大的数字, divmod() 更快。divmod() 同时计算商和余数并返回两者。// 和 % 运算符分别计算商和余数,但只返回结果之一。

divmod() 有更多的开销,但只执行一个除法。// 和 % 的开销较少,但执行两个除法。只要与执行除法的时间相比开销较大,divmod() 就会变慢。但是一旦除法的成本大于开销,divmod() 会更快。