2012-07-17 121 views
4

我有一個3000x300矩陣文件(float)。當我讀取並轉換爲浮點數時,我得到了float64,這是python中的默認值。我嘗試了numpy和map()將它轉換爲float32(),但它們看起來效率很低。將字符串列表有效地轉換爲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)。 here is the question

回答

2

如果內存問題,並且如果您事先知道該字段的大小,則可能不希望首先讀取整個文件。像這樣的東西可能更合適:

#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 
+0

感謝@mgilson,如果我沒有發現任何其他有效的方法。我需要解決這個問題。 – Maggie 2012-07-17 18:11:08

+0

3000×300矩陣文件需要的時間是'0:00:05.885000' – Maggie 2012-07-17 18:16:47

+1

@Mahin - 如果使用map(float,line.split())而不是map(np.float32,line.split ))'?你實際上可能會看到性能提升(從「向量化」演員陣容從「double」到「float」)... – mgilson 2012-07-17 18:59:49