如果您提供(整数)幂作为输入,创建相应的十的幂的最快方法是什么? 我想到了四种选择,其中最快的方法似乎是使用 f-string:
from functools import partial
from time import time
import numpy as np
def fstring(power):
return float(f'1e{power}')
def asterisk(power):
return 10**power
methods = {
'fstring': fstring,
'asterisk': asterisk,
'pow': partial(pow, 10),
'np.pow': partial(np.power, 10, dtype=float)
}
# "dtype=float" is necessary because otherwise it will raise:
# ValueError: Integers to negative integer powers are not allowed.
# see https://dev59.com/olgQ5IYBdhLWcg3wGgP0#43287598
powers = [int(i) for i in np.arange(-10000, 10000)]
for name, method in methods.items():
start = time()
for i in powers:
method(i)
print(f'{name}: {time() - start}')
结果:
fstring: 0.008975982666015625
asterisk: 0.5190775394439697
pow: 0.4863283634185791
np.pow: 0.046906232833862305
我猜f-string方法是最快的,因为实际上没有计算任何东西,尽管它仅适用于十的整数幂,而其他方法是更复杂的操作,也适用于任何实数作为底数和指数。那么f-string实际上是最好的方法吗?
fstring
只计算单个float
,估算单个double
类型的十次幂。其他所有的都是构建一个大整数。sys.getsizeof(10**10000)
给我 4456 - 这是一个大整数。我没有偷看算法,但增加 Python 整数的成本相对较高。如果浮点数对你的应用程序足够好,那么就使用它。但如果你真的想要整数,你就要付出代价。 - tdelaneyint('1' + power * '0')
吗? - Arnenp.pow
方法看起来有些虚假,因为对于指数大于38/308/4932
的float32/float64/float128
类型,它们将返回inf
。 - ekhumorodecimal.Decimal
很快。我在全局定义了ten = decimal.Decimal('10')
,然后函数中返回ten ** power
。 - tdelaney