python-3.x - 获取回文数列表的哪个代码更可取?
问题描述
您需要获得一个列表,其中包含 100 到 1000 范围内的所有回文数。这个问题可以通过两种方式解决:
- 检查号码的第一位和最后一位数字,如果它们匹配,则将它们写入列表。
palindromes = [n for n in range(100, 1000) if n // 100 == n % 10]
print(palindromes)
- 将数字转换为字符串并使用其“反转”副本进行检查。
palindromes = [i for i in range(100, 1001) if str(i) == str(i)[::-1]]
print(palindromes)
问题:这些方法中哪一种更可取(解释更快或占用更少的 PC 资源),哪一种更好用?
解决方案
时间以及另一种解决方案:
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()
推荐阅读
- spotify-scio - 如何将 SCollection[String] 转换为 Seq[String] 或 List[String]?
- python - 我的 webhook 脚本中的 message\member 有问题
- android - 如何在android中关闭jitsi会议室?
- css - Vue Bootstrap 流体容器错误断点
- go - 根据 fmt.Errorf 返回的错误检查(值或类型)
- swift - 在 swift 中对文本字段实施两个限制
- c - 来自 MIPS 平台上的 uClibc 的 sem_wait() 返回未实现
- typescript - 在单独的 Typescript 文件中编写 Vue Js 组件数据、方法、道具
- java - 我们可以使用spring kafka批处理监听器实现一个消息处理吗?
- reactjs - React:: 错误:GraphQL 错误:无法读取未定义的属性“标题”