繁体   English   中英

有效地将字符串列表转换为float32

[英]Convert a string list to float32 efficiently

我有一个3000x300矩阵文件(浮动)。 当我读取并转换为float时,我得到的是float64,这是python中的默认值。 我尝试了numpy和map()将其转换为float32(),但它们似乎都效率很低。

我的代码:

x = open(readFrom, 'r').readlines()
y = [[float(i) for i in s.split()] for s in x]

花费时间: 0:00:00.996000

numpy的实现:

x = open(readFrom, 'r').readlines()
y = [[np.float32(i) for i in s.split()] for s in x]

花费时间: 0:00:06.093000

地图()

x = open(readFrom, 'r').readlines()
y = [map(np.float32, s.split()) for s in x]

花费时间: 0:00:05.474000

如何高效转换为float32?

谢谢。

Update:

numpy.loadtxt()numpy.genfromtxt() )对于大型文件不起作用(产生内存错误)。 我已经发布了一个与此相关的问题,在此介绍的方法对于大型矩阵文件(50,000x5000)效果很好。 这是问题

如果存在内存问题,并且如果您提前知道字段的大小,则可能您不希望首先读取整个文件。 像这样的东西可能更合适:

#allocate memory (np.empty would work too and be marginally faster, 
#                 but probably not worth mentioning).
a=np.zeros((3000,300),dtype=np.float32)  
with open(filename) as f:
    for i,line in enumerate(f):
        a[i,:]=map(np.float32,line.split()) 

从我的机器上进行的几次快速(且令人惊讶的)测试来看,似乎甚至没有必要使用该map

a=np.zeros((3000,300),dtype=np.float32)  
with open(filename) as f:
    for i,line in enumerate(f):
        a[i,:]=line.split() 

这可能不是最快的方法,但是肯定会是内存使用效率最高的方法。

一些测试:

import numpy as np

def func1():   #No map -- And pretty speedy :-).
    a=np.zeros((3000,300),dtype=np.float32)
    with open('junk.txt') as f:
        for i,line in enumerate(f):
            a[i,:]=line.split()

def func2():
    a=np.zeros((3000,300),dtype=np.float32)
    with open('junk.txt') as f:
        for i,line in enumerate(f):
            a[i,:]=map(np.float32,line.split())

def func3():
    a=np.zeros((3000,300),dtype=np.float32)
    with open('junk.txt') as f:
        for i,line in enumerate(f):
            a[i,:]=map(float,line.split())

import timeit

print timeit.timeit('func1()',setup='from __main__ import func1',number=3)  #1.36s
print timeit.timeit('func2()',setup='from __main__ import func2',number=3)  #11.53s
print timeit.timeit('func3()',setup='from __main__ import func3',number=3)  #1.72s

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM