首页 > 解决方案 > 获取回文数列表的哪个代码更可取?

问题描述

您需要获得一个列表,其中包含 100 到 1000 范围内的所有回文数。这个问题可以通过两种方式解决:

  1. 检查号码的第一位和最后一位数字,如果它们匹配,则将它们写入列表。
palindromes = [n for n in range(100, 1000) if n // 100 == n % 10]
print(palindromes)
  1. 将数字转换为字符串并使用其“反转”副本进行检查。
palindromes = [i for i in range(100, 1001) if str(i) == str(i)[::-1]]
print(palindromes)

问题:这些方法中哪一种更可取(解释更快或占用更少的 PC 资源),哪一种更好用?

标签: python-3.x

解决方案


时间以及另一种解决方案:

 67.6 μs  [n for n in range(100, 1000) if n // 100 == n % 10]
419.0 μs  [i for i in range(100, 1001) if str(i) == str(i)[::-1]]
 10.1 μs  [i*10 + i//10 for i in range(10, 100)]

“资源”(内存)对于所有这些都是最小的。

str解决方案具有最容易缩放的优点,例如,您可以将其范围更改为range(100, 1000001),它会找到更长的回文。

非过滤解决方案具有缩放最佳的优点,即对于更长的数字,该方法与其他方法相比甚至更快。

我的基准代码(在线试用!):

from timeit import repeat

S = [
    '[n for n in range(100, 1000) if n // 100 == n % 10]',
    '[i for i in range(100, 1001) if str(i) == str(i)[::-1]]',
    '[i*10 + i//10 for i in range(10, 100)]',
]

for _ in range(3):
    for s in S:
        t = min(repeat(s, number=100)) / 100
        print('%5.1f μs ' % (t * 1e6), s)
    print()

推荐阅读