我试图将YCbCr-file 从8 bpp转换为10 bpp。python性能处理二进制文件
到目前为止,我的最佳方法仍然比最基本的天真C实现慢 。
C中的朴素方法运行时间约为8s。将代码改为 而不是代码块,将时间降到1秒以下。
我很想知道从标准python处理二进制文件得到 是什么样的性能。示例文件是 ,在CIF-resolution中,与1080p中的内容相比“小”。 随意添加numpy的建议,以及我主要感兴趣 在标准的Python。
测试文件可以从
http://trace.eas.asu.edu/yuv/foreman/foreman_cif.7z
sha1sum
被下载正确的10位输出是
c511dabc793383f7fd0ed69b4bb9b9f89ef73b84
蟒:
#!/usr/bin/env python
import array
f_in = 'foreman_cif.yuv'
f_out = 'py_10bpp.yuv'
def bytesfromfile(f):
while True:
raw = array.array('B')
raw.fromstring(f.read(8192))
if not raw:
break
yield raw
with open(f_in, 'rb') as fd_in, \
open(f_out, 'wb') as fd_out:
for byte in bytesfromfile(fd_in):
data = []
for i in byte:
i <<= 2
data.append(i & 0xff)
data.append((i >> 8) & 0xff)
fd_out.write(array.array('B', data).tostring())
朴素C-DITO:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int c;
int d[2];
FILE* fd_in;
FILE* fd_out;
fd_in = fopen("foreman_cif.yuv", "rb");
fd_out = fopen("c_10bpp.yuv", "wb");
while((c = fgetc(fd_in)) != EOF) {
c <<= 2;
d[0] = c & 0xff;
d[1] = (c >> 8) & 0xff;
fwrite(&d[0], 1, 1, fd_out);
fwrite(&d[1], 1, 1, fd_out);
}
fclose(fd_in);
fclose(fd_out);
return EXIT_SUCCESS;
}
FWIW,运行此代码需要我在CPython中处理33秒,在PyPy中处理(未修改)7秒,在C中处理约3秒。 – DSM 2013-04-09 20:07:37
同样的球场:用'-O2'编译时,Cython〜20s和C〜2.5 。首先做了没有电源线到我的笔记本电脑,导致我的核心运行@ 800MHz的测量。 “数量级”来自于此。连接电源线和运行@ 2.2GHz的核心我得到上面的数字 – 2013-04-09 20:33:08