文本读写与二进制读写 速度对比 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 倍
总结
从以上对比情况来看,合理的二进制读写可以在很大程度上提升数据的存储速度,并保证数据准确。该方法可显著提升数据的传递效率。
|