Set*_*hot 8 python performance
Lemme澄清:
什么是获得两个数字之间所有唯一数字的每个数字的最快方法.例如,10,000和100,000.
一些明显的将是12,345或23,456.我正试图找到一种方法来收集所有这些.
for i in xrange(LOW, HIGH):
str_i = str(i)
...?
Run Code Online (Sandbox Code Playgroud)
Tad*_*eck 15
from itertools import permutations
result = [
a * 10000 + b * 1000 + c * 100 + d * 10 + e
for a, b, c, d, e in permutations(range(10), 5)
if a != 0
]
Run Code Online (Sandbox Code Playgroud)
我用了这样一个事实:
10000,并100000有5个或6位数字,但只有在这里6位数字,没有独特的数字,itertools.permutations创建所有的组合,与所有排序(因此两者12345和54321将出现在结果),具有给定长度,编辑:
感谢您接受我的回答,但这是其他人的数据,比较上述结果:
>>> from timeit import timeit
>>> stmt1 = '''
a = []
for i in xrange(10000, 100000):
s = str(i)
if len(set(s)) == len(s):
a.append(s)
'''
>>> stmt2 = '''
result = [
int(''.join(digits))
for digits in permutations('0123456789', 5)
if digits[0] != '0'
]
'''
>>> setup2 = 'from itertools import permutations'
>>> stmt3 = '''
result = [
x for x in xrange(10000, 100000)
if len(set(str(x))) == len(str(x))
]
'''
>>> stmt4 = '''
result = [
a * 10000 + b * 1000 + c * 100 + d * 10 + e
for a, b, c, d, e in permutations(range(10), 5)
if a != 0
]
'''
>>> setup4 = setup2
>>> timeit(stmt1, number=100)
7.955858945846558
>>> timeit(stmt2, setup2, number=100)
1.879319190979004
>>> timeit(stmt3, number=100)
8.599710941314697
>>> timeit(stmt4, setup4, number=100)
0.7493319511413574
Run Code Online (Sandbox Code Playgroud)
所以,总结一下:
最后的解决方案比其他人提出的解决方案快了大约10倍.
注意:我的解决方案有一些我没有测量的导入.我假设您的导入将发生一次,代码将被执行多次.如果不是这样,请根据您的需要调整测试.
编辑#2:我添加了另一个解决方案,因为甚至不需要对字符串进行操作 - 它可以通过实数整数的排列来实现.我敢打赌,这可以加快速度.
廉价的方法:
for i in xrange(LOW, HIGH):
s = str(i)
if len(set(s)) == len(s):
# number has unique digits
Run Code Online (Sandbox Code Playgroud)
这使用a set来收集唯一数字,然后检查以查看总数中有多少个唯一数字.
| 归档时间: |
|
| 查看次数: |
1105 次 |
| 最近记录: |