Python NumPy读/写文件性能(特别是ndarray.tofile)

Python NumPy读/写文件性能(特别是ndarray.tofile),python,python-3.x,performance,numpy,Python,Python 3.x,Performance,Numpy,我决定比较NumPy的ndarray.tofile与标准f.write的性能,结果让我感到惊讶。为什么tofile~30倍于正常的文件写入速度?在庞大的数据集上,tofile的性能是否优于f.write 写入: ndarray.tofile(文件):10.668秒 timeit.timeit("a.tofile(f)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)"

我决定比较NumPy的
ndarray.tofile
与标准
f.write
的性能,结果让我感到惊讶。为什么
tofile
~30倍于正常的文件写入速度?在庞大的数据集上,
tofile
的性能是否优于
f.write

写入:

ndarray.tofile(文件):10.668秒

timeit.timeit("a.tofile(f)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)")
timeit.timeit("f.write(a.tobytes())", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)")
timeit.timeit("a=np.array(list(f.read()),dt)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','rb');")
timeit.timeit("a=np.fromfile(f,dt)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','rb');")
write | file.write(ndarray.tobytes()):0.316秒

timeit.timeit("a.tofile(f)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)")
timeit.timeit("f.write(a.tobytes())", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)")
timeit.timeit("a=np.array(list(f.read()),dt)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','rb');")
timeit.timeit("a=np.fromfile(f,dt)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','rb');")

阅读:

np.array(list(f.read()),dt):11.544秒

timeit.timeit("a.tofile(f)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)")
timeit.timeit("f.write(a.tobytes())", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)")
timeit.timeit("a=np.array(list(f.read()),dt)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','rb');")
timeit.timeit("a=np.fromfile(f,dt)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','rb');")
np.fromfile(f,dt):11.544秒

timeit.timeit("a.tofile(f)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)")
timeit.timeit("f.write(a.tobytes())", "import numpy as np; dt=np.dtype('B'); f=open('test.x','wb'); a=np.array(range(100),dt)")
timeit.timeit("a=np.array(list(f.read()),dt)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','rb');")
timeit.timeit("a=np.fromfile(f,dt)", "import numpy as np; dt=np.dtype('B'); f=open('test.x','rb');")

我有
0.225秒
0.348秒
0.348秒
write
通过读取
tofile()
的源代码,它复制文件句柄,调用
flush()
将数据写入磁盘。但是
f.write()
将在内存中缓存数据。@filippo您使用了相同的命令吗?我正在使用Anaconda/python3.6.4/Windows10@DarkMatterMatt我错过了
3.x
标签。我可以在
3.6.3
上复制与您类似的结果,而
tofile
2.7.14
上的速度稍快一些(相同的numpy版本,
1.14.3