获取python中的最高有效数字



假设我有列表[34523, 55, 65, 2]

获得最高有效数字[3,5,6,2]的最有效方法是什么。如果可能,不将每个更改为str()

假设你只处理正数,你可以用每个数字除以比这个数字小的10的最大幂,然后取结果。

>>> from math import log10, floor
>>> lst = [34523, 55, 65, 2]
>>> [floor(x / (10**floor(log10(x)))) for x in lst]
[3, 5, 6, 2]

如果您使用Python 3,则可以使用整数除法运算符//:

>>> [x // (10**floor(log10(x))) for x in lst]
[3, 5, 6, 2]

然而,我不知道这是否比转换为字符串并对第一个字符进行切片更有效。(注意,如果你必须处理0到1之间的数字,你需要更复杂一点。)

>>> [int(str(x)[0]) for x in lst]
[3, 5, 6, 2]

如果这是在一段性能关键的代码中,您应该衡量这两个选项,看看哪个更快。如果它不在性能关键的代码中,请使用您最可读的代码。

我使用python 3.6.1:进行了一些计时

from timeit import timeit
from math import *

lst = list(range(1, 10_000_000))

# 3.6043569352230804 seconds
def most_significant_str(i):
    return int(str(i)[0])

# 3.7258850016013865 seconds
def most_significant_while_floordiv(i):
    while i >= 10:
        i //= 10
    return i

# 4.515933519736952 seconds
def most_significant_times_floordiv(i):
    n = 10
    while i > n:
        n *= 10
    return i // (n//10)

# 4.661690454738387 seconds
def most_significant_log10_floordiv(i):
    return i // (10 ** (log10(i) // 1))

# 4.961193803243334 seconds
def most_significant_int_log(i):
    return i // (10 ** int(log10(i)))

# 5.722346990002692 seconds
def most_significant_floor_log10(i):
    return i // (10 ** floor(log10(i)))

for f in (
    'most_significant_str',
    'most_significant_while_floordiv',
    'most_significant_times_floordiv',
    'most_significant_log10_floordiv',
    'most_significant_int_log',
    'most_significant_floor_log10',
):
    print(
        f,
        timeit(
            f"""
for i in lst:
    {f}(i)
            """,
            globals=globals(),
            number=1,
        ),
    )

正如您所看到的,对于range(1, 10_000_000)中的数字,int(str(i)[0])比其他方法更快。我能得到的最接近的是使用一个简单的while循环:

def most_significant_while_floordiv(i):
    while i >= 10:
        i //= 10
    return i

相关内容

  • 没有找到相关文章

最新更新