写入0到1000000000的数字

2024-05-29 07:48:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将从0到1000000000的数字列表作为字符串直接写入文本文件。我也希望每个数字的前导零最多有十位数,例如0000000000, 0000000001, 0000000002, 0000000003, ... n.,但是我发现这对我的口味来说太长了。在

我可以使用seq,但不支持前导零,因此我宁愿避免使用awk和其他辅助工具来处理这些任务。我意识到用C编写这个代码可以显著提高速度,但我不想求助于它。我正在考虑将一些函数映射到一个大的列表中并在一个循环中执行它们,但是我只有2GB的RAM可用,所以在处理我的问题时请记住这一点。在

我正在使用Python-Progressbar,预计到达时间大约为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解决方案,那将是非常受欢迎的。在


Tags: 字符串列表数字seqlimit辅助工具pu文本文件
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).

FWIWseq确实有一个格式化选项:

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

你的长时间可能与记忆有关。对于较大的范围,使用xrange更节省内存,因为它不会在开始之前尝试计算并将整个范围存储在内存中。请参阅标题为Should you always favor xrange() over range()?

编辑:使用python3意味着xrange与range的使用无关。在

相关问题 更多 >

    热门问题