【问题标题】:Getting Floor Division and Remainder at same time in 2 separate variables在 2 个单独的变量中同时获取楼层除法和余数
【发布时间】:2017-11-23 08:51:34
【问题描述】:

是否有一个 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() 效果会更好。

【问题讨论】:

  • 我猜你不在此代码之后,但我想会检查:a=10 b=2 div=a//b mod=a%b
  • @KatiaPunter 我一直在寻找某种内置功能,因为有时这些功能要快得多。但我也会对该解决方案进行计时,看看哪个表现更好。谢谢
  • @joaoavf 你从哪里得到这些数字的? took 2.56 seconds to run 和 took 3.99 seconds to run
  • @KatiaPunter,您的解决方案实际上更快
  • @Elis 刚刚在我的电脑上运行了它,如果你能复制我将不胜感激

标签: python optimization


【解决方案1】:

使用这个。这会对你有所帮助。

a,b = divmod(10,2)

它会返回两个值

【讨论】:

  • 我错过了什么吗?因为那只是给你a=2和b=2,而不是OP要求b=0.5的位置。
  • 哦,他编辑了这个问题,只要求简单的a % b。很公平。
  • 这正是我所需要的。我会测试它的性能。非常感谢。
  • @KarlReid,是的,这也很好用。我的问题不太好,抱歉。
  • 你在回答中首先写了什么? OP 在2017-11-22 12:33:06Z 编辑了a = 2; b = 2,您确实在2017-11-22 12:31:01Z 回答了这个问题。你用时间旅行还是什么的?
【解决方案2】:

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

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

$ 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() 会更快。

【讨论】:

  • 非常感谢!非常感谢您的洞察力。
  • 顺便说一句,我想知道为什么没有人想到 /% 运算符而不是 divmod 函数。我们有// 和%,/% 可以很好地总结它们,我想。
【解决方案3】:

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

这是link to its docs

例子

>>> a, b = divmod(10, 4)
>>> print a, b
>>> 2 2

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多