写数字从0到1000000000

时间:2013-07-22 15:06:45

标签: python string text python-3.x numbers

我正在尝试将0到1000000000之间的数字列表作为字符串直接写入文本文件。我还希望每个数字都有前导零,最多十位数,例如0000000000, 0000000001, 0000000002, 0000000003, ... n.然而,我发现我的口味花了太长时间。

我可以使用seq,但不支持前导零,我宁愿避免使用awk和其他辅助工具来处理这些任务。我知道只需要用C编码就可以获得显着的加速效果,但我不想诉诸它。我正在考虑将一些函数映射到一个大的列表并在循环中执行它们,但是我只有2GB的RAM可用,所以在接近我的问题时请记住这一点。

我正在使用Python-Progressbar,我的ETA约为2小时。如果有人能就如何解决这个问题给我一些建议,我将不胜感激:

pbar = ProgressBar(widgets=[Percentage(), Bar(), ' ', ETA(), ' ', FileTransferSpeed()], maxval=1000000000).start()

with open('numlistbegin','w') as numlist:
    limit, nw, pu = 1000000000, numlist.write, pbar.update

    for x in range(limit):
        nw('%010d\n'%(x,))
        pu(x)
pbar.finish()
编辑:所以我发现格式化(无论你使用的是什么编程语言)都会产生大量的开销。 Seq可以快速完成工作,但格式化选项(-f)要慢得多。但是,如果有人想提供python解决方案,那将是非常受欢迎的。

2 个答案:

答案 0 :(得分:3)

FWIW seq确实有格式化选项:

$ seq -f "%010g" 1 5
0000000001
0000000002
0000000003
0000000004
0000000005

你的长时间可能与记忆有关。对于大范围,使用xrange可以提高内存效率,因为它不会在启动之前计算并将整个范围存储在内存中。请参阅标题为Should you always favor xrange() over range()?

的帖子

编辑:使用Python 3意味着xrange与范围使用无关。

答案 1 :(得分:2)

我做了一些实验,发现大批量写作可以使性能提高约30%。我不确定为什么你的代码需要2个小时来生成文件 - 除非进度条正在扼杀性能。如果是这样,您应该应用相同的批处理逻辑来更新进度条。我的旧Windows框将在大约73秒内创建所需大小的十分之一的文件。

# Python 2.
# Change xrange to range for Python 3.

import time

start_time = time.time()

limit = 100000000  # 1/10 your limit.
skip  = 1000       # Batch size.

with open('numlistbegin', 'w') as fh:
    for i in xrange(0, limit, skip):
        batch = ''.join('%010d\n' % j for j in xrange(i, i + skip, 1))
        fh.write(batch)

print time.time() - start_time   # 73 sec. (106 sec. without batching).