将文件存储为整数矩阵的有效方法

时间:2019-06-14 23:53:01

标签: python python-3.x

哪种方式是读取格式如下的文件的最有效方式:

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)慢的任何见解,我将不胜感激!

谢谢!

2 个答案:

答案 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]

文档:

https://docs.python.org/3/library/shelve.html