哪种方式是读取格式如下的文件的最有效方式:
0 0 1 1 0 1 0 1
0 1 0 0 0 1 1 1
1 1 1 0 1 1 0 0
并将其存储为这样的矩阵?:
[[0, 0, 1, 1, 0, 1, 0, 1],
[0, 1, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 0, 0]]
请注意,文件中的每一行均以字符串形式读取,例如第一个是:
"0 0 1 1 0 1 0 1"
因此,必须将字符串的字符拆分并转换为整数。
我尝试了几种方法,而我发现更快的一种方法是使用map():
代码a)
with open(filename, "r") as file:
matrix = []
for line in file:
matrix.append([value for value in map(int, line.split())])
我发现多重处理要慢得多,但是我确定自己做错了什么:
代码b)
from multiprocessing.dummy import Pool
with open(filename, "r") as file:
# splitting function
def f(file):
values = [int(char) for line in file for char in line.split()]
return values
# 4 threads
with Pool(4) as pool:
matrix = pool.map(f, file)
您知道实现这一目标的更有效的方法吗?
额外:如果您了解多线程/多处理功能,那么对于为什么代码b)实际上比代码a)慢的任何见解,我将不胜感激!
谢谢!
答案 0 :(得分:3)
您可以简单地使用numpy:
import numpy as np
matrix = np.loadtxt(open("test.txt", "rb"), delimiter=" ", dtype=int).tolist()
print(matrix)
输出:
[[0, 0, 1, 1, 0, 1, 0, 1],
[0, 1, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 0, 0]]
答案 1 :(得分:1)
如果您想从文件中获取编号,我肯定会检查熊猫文档,因为我打算读取csv和其他内容,或者使用Sebastien提供的答案
我使用的是存储数据,它非常简单,并且可以显示大多数python对象。
文档引用:
“架子”是一个持久的类字典对象。与“ dbm”数据库的区别在于,架子中的值(不是键!)本质上可以是任意的Python对象-pickle模块可以处理的任何对象。这包括大多数类实例,递归数据类型以及包含许多共享子对象的对象。键是普通的字符串。
速度很快,至少从我的经验来看(也许我需要更大的数据才能找到更好的库) 我只是测量了写入100k个元素的时间,每个元素都有大约100个随机整数。不到2秒。
文件的大小可以比原始文本大一点,但会保存为字典。
import numpy as np
import shelve
deck = np.arange(10)
np.random.shuffle(deck)
print(deck)
with shelve.open('dummy', 'n') as file:
file['my_data'] = deck
with shelve.open('dummy') as file:
print(file['my_data'])
[2 0 5 6 8 1 4 9 7 3]
[2 0 5 6 8 1 4 9 7 3]