文本读写与二进制读写 速度对比 Python Matlab


文章目录

  • 文本读写与二进制读写 速度对比 Python Matlab
  • 引言
  • Python
  • 对比方法
  • 测试结果
  • Matlab
  • 对比方法
  • 测试结果
  • 总结


引言

数据读写的速度往往会占用大量的时间,因此对Python和Matlab中不同的数据输出方式的速度进行了简单对比。

这是因为最近在写代码的过程中遇到一个问题,需要跨进程进行数据传输,但是目前还不太会使用共享内存,因此使用了较为传统的方式:一个程序将数据保存为文件,之后另一个程序进行读取,但是发现耗时较为严重,所以试图通过一些方法进行提速。

Python

对比方法

以大量的浮点数存储到文件中的任务进行测试。

首先对比Python中不同方法进行测试。

方式一:将浮点数转换成字符串,然后存储到文件中。

方式二:通过struct模块将数据转化为二进制,然后以二进制的方式写入文本。

方式三:将数据存放在Numpy的array中,通过tofile()函数直接进行二进制存储。

测试的完整代码如下:

import sys
import random
import time
import struct
import numpy as np
from array import array

def generate_random(n):
    random.seed(10)
    data = np.zeros(n)
    for i in range(n):
        data[i] = random.random()
    return data

def save_text(data):
    timest =  time.time()
    filename = '1.mac'
    f = open(filename,'w')
    for i in data:
        a = '%.6f' % i 
        f.write(a)
    f.close()
    timeend = time.time()
    print(timeend - timest,"存入文本 用时")
    return 0

def save_binary(data):
    '通过struct 打包进行读写'
    timest =  time.time()
    filename = '2.mac'
    f = open(filename,'wb')
    for i in data:
        a = struct.pack('d', i)
        f.write(a)
    f.close()
    timeend = time.time()
    print(timeend - timest, "struct 二进制 用时")
    return 0

def numpytofile(data):
    '直接使用numpy里的tofile'
    timest =  time.time()
    arr = data
    arr.tofile("3.bin")
    timeend = time.time()
    print(timeend - timest, " numpy 二进制 用时")
    return 0

def main(argv):
    # 对不同的写数据的方式进行对比
    data = generate_random(1000000)
    save_text(data)
    save_binary(data)
    numpytofile(data)

if __name__ == '__main__':
    main(sys.argv[1:])

测试结果

对100w个随机生成的浮点数进行测试。

三种方法的耗时如下:

0.4208517074 方法1:存入文本 用时
0.1994802951 方法2:struct 二进制 用时
0.0029914379 方法3:numpy 二进制 用时

从耗时结果来看,在存储同样的数据时,不同存储方式耗费的时间相差较大,其中以numpy的方式速度最快,且快进百倍。三种方法的对比如下表

方法

耗时(s)

优点

缺点

方法一

0.420851

输出的文件可读

速度最慢,会丢失浮点数的精度

方法二

0.199480

-

-

方法三

0.002991

输出速度最快,精确存储浮点数的值

无法直接看到数据值

Matlab

对比方法

Matlab中也有多种数据输出方式。简单对比了两种方法:

方法一:使用dlmwrite函数

方法二:二进制方式输出

% 注释
rng('default')
arr = rand(100000,1);

% 方法一 使用dlmwrite函数输出
tic
dlmwrite('method1.txt',arr)
toc
t1 = toc;

% 方法二 使用二进制的方式输出
tic
fid = fopen('method2.bin','wb');
fwrite(fid,arr,'float64');
fclose(fid);
toc
t2 = toc;

测试结果

方法一:历时 1.449960 秒。
方法二:历时 0.001632 秒。
在输出10w 个浮点数时,其运行速度之比约 1.449/0.00163 = 888 倍

总结

从以上对比情况来看,合理的二进制读写可以在很大程度上提升数据的存储速度,并保证数据准确。该方法可显著提升数据的传递效率。