Python 如何更有效地创建数字递增的整数?
上面的代码提供了数字按升序排列的整数列表。但随着位数的增加,它的效率会降低。有没有办法让代码更高效?我们能让它适用于超过30位的数字吗Python 如何更有效地创建数字递增的整数?,python,python-3.x,algorithm,Python,Python 3.x,Algorithm,上面的代码提供了数字按升序排列的整数列表。但随着位数的增加,它的效率会降低。有没有办法让代码更高效?我们能让它适用于超过30位的数字吗 def gen_dig(digits): """Assumes digits is an integer; Returns a list containing integers with digits in ascending order""" lst=[] start=int('1'+'0'*digits) end=in
def gen_dig(digits):
"""Assumes digits is an integer;
Returns a list containing integers with digits in ascending order"""
lst=[]
start=int('1'+'0'*digits)
end=int('1'+'0'*(digits+1))
for num in range(start,end):
if str(num)==''.join(sorted(str(num))):
lst.append(num)
return lst
关于算法的建议:
- 获取起始编号,例如2004050
- 从开头开始,将小于第一个数字的所有数字设置为第一个数字的值,即2224252
- 从第二个数字(仍然是2224252)、第三个数字(仍然是2224252)、第四个数字(2224454)一直重复到最后一个数字(2224455)
我不确定它是否适用于10^30范围内的数字,但它至少会在开始时跳过11%的数字(1000…到1111…)。这应该在中午12点再次发生。。。到1222年。。。依此类推,所以它可能足够快。一种带递归的方法:
str_numbers = '0123456789'
def generate(number):
yield from helper(number + 1, 1)
def helper(num_pos, num_from):
if num_pos == 1:
yield from str_numbers[num_from:]
else:
for i in range(num_from, 10):
for n in helper(num_pos-1, i):
yield str(i) + n
for i, num in enumerate(generate(10)):
print(i, num)
印刷品:
0 11111111111
1 11111111112
2 11111111113
3 11111111114
4 11111111115
5 11111111116
...
75575 88888899999
75576 88888999999
75577 88889999999
75578 88899999999
75579 88999999999
75580 89999999999
75581 99999999999
使用
timeit
快速基准测试:
from timeit import timeit
t1 = timeit(lambda: gen_dig(6), number=1)
t2 = timeit(lambda: list(generate(6)), number=1)
print(t1)
print(t2)
在我的机器上打印:
6.965828249998594
0.009299607001594268
一种解决方案是使用
itertools。组合\u和替换\u
:
from itertools import combinations_with_replacement
for comb in combinations_with_replacement("123456789", num_digits):
print(''.join(comb))
注意根据
如果对输入iterable进行排序,则组合元组将
按顺序生产的
因此,输出的顺序是有保证的
同时,doc中的等效实现表明,在每个输出组合元组中,元素遵循与输入iterable相同的顺序。因此,每个输出组合中的数字顺序也是有保证的。能否添加示例输入和所需输出?您需要选择更好的算法。不管你如何加速,这种蛮力方法都会很慢。@MarkRansom,我知道它效率很低。但我想不出比这更好的算法了。不要通读所有的数字,检查它们是否符合要求。首先只生成满足要求的数字。您真的想要所有这些数字吗?或者你只是想知道有多少?我想,OP可以自己实现。但知道你们提供免费的编码服务也很好。@ThomasWeller我试图提高效率,但因为生成(20)需要19秒。对于
30
我还没有试过。我会把第一行写成stru numbers='0123456789'
。“简单多了!”AndrejKesely说,代码运行得很顺利。今天学到了一些新东西