【问题标题】:Generate large random text files with python and NumPy使用 python 和 NumPy 生成大型随机文本文件
【发布时间】:2017-07-15 20:52:37
【问题描述】:

为了测试数据,我需要快速创建随机文本的大文件。我有一个解决方案,taken from here,如下所示:

import random
import string

n = 1024 ** 2  # 1 Mb of text
chars = ''.join([random.choice(string.letters) for i in range(n)])

with open('textfile.txt', 'w+') as f:
    f.write(chars)

我的问题是这需要 653 毫秒才能执行,这对我的使用来说太长了。

有没有更快的方法来快速生成带有随机文本的文本文件?

【问题讨论】:

  • 我很好奇,这里的用例是什么?
  • 您可以将 random.choice(string.letters) for i in range(n) 放入生成器并使用yield使其更快
  • 对 python 使用类似 faker library 之类的东西
  • @JonasAdler 我用 numpy 计时了一个方法,它把这个时间缩短到 370 毫秒。还是太慢了吗?

标签: python string file numpy random


【解决方案1】:

创建一个 numpy 字母数组:

In [662]: letters = np.array(list(chr(ord('a') + i) for i in range(26))); letters
Out[662]: 
array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
       'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'],
      dtype='<U1')

使用 np.random.choice 生成随机索引 b/w 0 和 26,使用索引 letters 生成随机文本:

np.random.choice(letters, n)

时间安排:

In [664]: n = 1024 ** 2

In [701]: %timeit np.random.choice(letters, n)
100 loops, best of 3: 15.1 ms per loop

或者,

In [705]: %timeit np.random.choice(np.fromstring(letters, dtype='<U1'), n)
100 loops, best of 3: 14.1 ms per loop

【讨论】:

  • 我可以稍微修改一下并获得一个数量级的更好性能:np.random.choice(np.fromstring(string.letters, dtype='S1'), n),总时间17 ms。你能更新答案,我会接受这个答案吗?
  • @JonasAdler 这给了你一个字符列表,对吧?你会想把它们结合在一起。
  • 看来f.write 接受字符数组。结果看起来还不错,写的基本是即时的。
  • @JonasAdler 如果你不介意它们不是二进制字符串的话,我让你快一点。
  • @JonasAdler 很高兴为您提供帮助 :)
猜你喜欢
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多