【发布时间】:2023-04-09 11:21:02
【问题描述】:
我正在使用以下代码从 500 个*.txt 文件中导入 3 列中的 2 列(触发器和幅度):
from glob import glob
import pandas
dataFileList = glob( '*.txt' )
nbDataSamplesFiles = len(dataFileList)
amplitudes = []
colnames = ['time','trigger','amplitude']
for dataFileName in dataFileList :
#Method4
data = pandas.read_csv( dataFileName, delim_whitespace=True, skipinitialspace=True, names = colnames ) #Environ 4.5s pour 500 fichiers
trigger1 = data['trigger'].tolist()
amplitude1 = data.amplitude.tolist() #another way
amplitudes.append( amplitude1 ) #list of lists
amplitudes = np.asarray( amplitudes ) #matrix nbFiles x nbSamples
完成这项工作大约需要 3.5 秒。
我需要它更快,有没有办法使用相同或另一个 python 模块来做到这一点?
我该如何实现呢?
更新 1:使用dask
import dask.dataframe as dd
amplitudes = []
for dataFileName in dataFileList :
df = dd.read_csv(urlpath = dataFileName, delim_whitespace=True, skipinitialspace=True, names = colnames )
trigger1 = df.trigger.values
amplitude1 = df.amplitude.values
amplitudes.append( amplitude1 ) #list of arrays
我想查看幅值1的内容:
ipdb> amplitude1[111:121]
*** ValueError: ('Arrays chunk sizes are unknown: %s', (nan,))
有什么想法吗?
【问题讨论】:
-
colnames 在循环期间不会更改。为什么不把它放在循环之外——不确定在 python 中做了哪些优化,但它有可能使事情(稍微)更快。
-
@KolaB 我把它放在循环之外并没有得到太多,事实上我没有区别,但无论如何都很好
-
在这种情况下,最好将它放回循环中 - 保持在使用它的范围内?我猜口译员正在进行必要的优化......
-
您能否将数据转换为另一种格式,例如 Parquet? matthewrocklin.com/blog/work/2017/06/28/use-parquet
-
@MRocklin 嗨,我还不知道。我们的人正在使用picoscope,但我不知道他们是如何获取数据的。他们只是把数据文件交给我