【发布时间】:2014-07-29 20:17:25
【问题描述】:
我一直假设整数除法比浮点除法快,但我做了一些似乎证明并非如此的测试。
import gmpy2, time, math
digits = 100000
scale = 10**digits # Decimal precision
gmpy2.get_context().precision = int(math.log2(10) * digits) # Binary precision
def start_timer():
global start_time
start_time = time.time()
def print_timer():
print("%s s" % (time.time() - start_time))
start_timer()
for i in range(1000):
x = scale // 3
print_timer()
start_timer()
for i in range(1000):
x = gmpy2.mpfr(1) / 3
print_timer()
start_timer()
for i in range(1000):
x = gmpy2.mpfr(1) / gmpy2.mpfr(3)
print_timer()
整数除法耗时 0.17 秒,mpfr 除法耗时 0.06 秒,两个浮点数相除耗时 15.56 秒。
我的问题:
- 我是否正确设置了此测试?
- mpfr 分割真的比原生分割更优化吗?
- 一个浮点数和一个整数的除法是否比两个浮点数的除法快得多?
【问题讨论】:
-
请注意,您在测试中包括了创建
mpfr对象的时间以及进行除法的时间。另外,我建议将timeit模块用于此类事情。 -
您真的感到惊讶吗?将 330000 位浮点数除以 2 位整数比将 330000 位浮点数除以另一个 330000 位浮点数要快得多? :-)
-
@MarkDickinson 文档说在除法期间两个数字都被转换为正确的类型,所以我认为这意味着两个数字都必须是整数或浮点数
-
我猜想在第二部分中,
gmpy2正在将 RHS3转换为具有小精度的mpfr实例(因为可以精确地完成而不损失精度) ,而在第三部门中,您将以当前精度创建两个成熟的mpfr实例。 -
而Python自己的长整数除法算法简单便携但没有特别优化。它并不是真正针对 100000 位计算。这就是 gmpy2 的用途。因此,'native' 除法比 MPFR 的除法慢一点也就不足为奇了。