编程语言
首页 > 编程语言> > 在Python中将数值数据快速转换为固定宽度格式的文件

在Python中将数值数据快速转换为固定宽度格式的文件

作者:互联网

将仅包含数字数据的记录转换为固定格式字符串并将其写入Python文件的最快方法是什么?例如,假设记录是一个庞大的列表,其中包含具有id,x,y和wt属性的对象,我们经常需要将它们刷新到外部文件中.可以使用以下代码段进行冲洗:

with open(serial_fname(), "w") as f: 
    for r in records:
        f.write("%07d %11.5e %11.5e %7.5f\n" % (r.id, r.x, r.y, r.wt))

但是,我的代码花了太多时间来生成外部文件,而在执行两次刷新之间应该做的事情时却花费了很少的时间.

修改原始问题:

我在编写服务器软件时遇到了这个问题,该软件通过从多个“生产者”系统中获取信息来跟踪全局记录集,并将对记录集的任何更改实时或近乎实时地传递给“消费者”系统以预处理形式.许多消费者系统是Matlab应用程序.

我在下面列出了到目前为止(感谢)收到的一些建议和一些评论:

>仅转储更改,而不转储整个数据集:我实际上已经在这样做.产生的变更集仍然很大.
>使用二进制(或其他一些更有效的)文件格式:Matlab可以合理有效地读取什么,并且该格式应该独立于平台,这使我非常受限制.
>使用数据库:我实际上是在尝试绕过当前的数据库解决方案,该解决方案既太慢又麻烦,特别是在Matlab方面.
>将任务划分为多个进程:目前,转储代码正在其自己的线程中运行.但是由于GIL,它仍在消耗相同的内核.我想我可以将其移至完全独立的过程.

解决方法:

我试图检查numpy.savetxt是否可以加快速度,所以编写了以下模拟:

import sys
import numpy as np

fmt = '%7.0f %11.5e %11.5e %7.5f'
records = 10000

np.random.seed(1234)
aray = np.random.rand(records, 4)

def writ(f, aray=aray, fmt=fmt):
  fw = f.write
  for row in aray:
    fw(fmt % tuple(row))

def prin(f, aray=aray, fmt=fmt):
  for row in aray:
    print>>f, fmt % tuple(row)

def stxt(f, aray=aray, fmt=fmt):
  np.savetxt(f, aray, fmt)

nul = open('/dev/null', 'w')
def tonul(func, nul=nul):
  func(nul)

def main():
  print 'looping:'
  loop(sys.stdout, aray)
  print 'savetxt:'
  savetxt(sys.stdout, aray)

我发现结果(在我的2.4 GHz Core Duo Macbook Pro,Mac OS X 10.5.8,DMG在python.org上使用的Python 2.5.4,从源代码构建的numpy 1.4 rc1上)令人惊讶,但它们可重复性很高所以我认为他们可能会引起关注:

$py25 -mtimeit -s'import ft' 'ft.tonul(ft.writ)'
10 loops, best of 3: 101 msec per loop
$py25 -mtimeit -s'import ft' 'ft.tonul(ft.prin)'
10 loops, best of 3: 98.3 msec per loop
$py25 -mtimeit -s'import ft' 'ft.tonul(ft.stxt)'
10 loops, best of 3: 104 msec per loop

因此,savetxt似乎比调用write的循环要慢几个百分点…但是好的旧打印(也在一个循环中)似乎比write快几个百分点(我想这避免了某种调用开销).我意识到,相差2.5%左右并不是很重要,但是这并不符合我的直觉,因此我想报告一下. (顺便说一句,使用真实文件而不是/ dev / null只会平均增加6或7毫秒,因此它不会以一种或另一种方式改变太多).

标签:large-data-volumes,performance,python
来源: https://codeday.me/bug/20191024/1919599.html