Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加快二进制文件打开速度_Python_Python 3.x_Binary - Fatal编程技术网

Python 加快二进制文件打开速度

Python 加快二进制文件打开速度,python,python-3.x,binary,Python,Python 3.x,Binary,我在下面的代码中查找目录中的文件,并在转换为十六进制之前以二进制格式打开它们 现在它运行起来了,但我想让它更快,current需要4分钟来读取100k文件,但不需要多个处理器上的多线程,只是想知道有什么想法 def binary_file_reader(file_data): with open(file_data, 'rb') as binary_file_data: binary_file_data = binary_file_data.read()

我在下面的代码中查找目录中的文件,并在转换为十六进制之前以二进制格式打开它们

现在它运行起来了,但我想让它更快,current需要4分钟来读取100k文件,但不需要多个处理器上的多线程,只是想知道有什么想法

def binary_file_reader(file_data):
    with open(file_data, 'rb') as binary_file_data:
        binary_file_data = binary_file_data.read()
        binary_data = binascii.hexlify(binary_file_data)
        binary_data = binary_data.decode("utf-8")
    return binary_data

if __name__ == "__main__":
    success_files_counted = 0
    unsuccess_files_counted = 0
    read_file_names = []
    device_directory = os.getcwd()

    for r, d, f in os.walk(device_directory):
        for file in f:
            try:
                file_data = os.path.join(r, file)
                binary_data = binary_file_reader(file_data)
                read_file_names.append("Successful: "+r+file)
                success_files_counted+=1       
            except IOError:
                read_file_names.append("Unsuccessful: "+r+file)
                unsuccess_files_counted+=1
Python模块允许类型并行处理

  • 多线程(用于I/O绑定任务)
  • 多进程(用于CPU限制的TAK)
使用10K文件评估两者的结果,以加速您的任务

  • 非并行和多线程几乎同时进行
  • 多进程版本大约快2倍
代码

注意:由于错误,将多处理代码放在单独的文件中。这对于其他环境不是必需的

文件:multi_process_hexify.py(所有处理代码)

测试

Processed main_unthreaded in 2.6610 sec
Successful 10000, Unsuccessfuil 0

Processed main_multithreaded in 3.2250 sec
Successful 10000, Unsuccessfuil 0

Processed main_multiprocessing in 1.2241 sec
Successful 10000, Unsuccessfuil 0
True
文件:main.py

输出

Processed main_unthreaded in 2.6610 sec
Successful 10000, Unsuccessfuil 0

Processed main_multithreaded in 3.2250 sec
Successful 10000, Unsuccessfuil 0

Processed main_multiprocessing in 1.2241 sec
Successful 10000, Unsuccessfuil 0
True

请你把代码的缩进改一下好吗?它将按原样引发sintax错误。(提示:粘贴到此处后,不要尝试手动缩进行:使用
{}
格式按钮或使用三个倒勾-\'\'\'来分隔代码块。)是的,这很奇怪。现在我想知道你对这个问题有什么看法。缩进是我最不关心的问题lol@RajB_007--要检查它是IO受限还是CPU受限,您可以注释掉二进制文件读取器中与`binary\u data=binascii.hexlify(二进制文件数据)binary\u data=binary\u data.decode(“utf-8”)`相对应的行,然后返回二进制文件数据。我在我的机器上尝试了一个多线程版本,所以想检查这是否有助于此测试(在我的机器上没有帮助,因为os.walk第一次很慢)。@RajB_007--添加了一个答案供尝试。在main.py中,您可以模拟数据或注释本节,以使用您的真实数据。@darryg噢,哇,太棒了。我很敬畏,非常感谢你,它工作得很好。我一定会仔细阅读的@很高兴我能帮上忙。您是否有机会使用您的实际数据?如果是这样,你的速度(如果有的话)是如何提高的?@DarryIG仍然把我的和你的结合在一起。一旦我完成测试工作,我将在2小时内发表评论。再次感谢你@亲爱的,我说过一次,再说一次,谢谢你。下面的结果和哇它的速度!起始文件夹:/Users在83.5037秒内处理了main_多线程,成功94241,未成功94259在51.2093秒内处理了main_多线程,成功94259,未成功5109在19.9108秒内处理了main_多线程,成功94259,未成功942595109@RajB_007--真是太好了。老实说,由于开销(即启动进程、在主进程和其他进程之间传输数据等),通常无法实现(即多进程实际上较慢)。
Processed main_unthreaded in 2.6610 sec
Successful 10000, Unsuccessfuil 0

Processed main_multithreaded in 3.2250 sec
Successful 10000, Unsuccessfuil 0

Processed main_multiprocessing in 1.2241 sec
Successful 10000, Unsuccessfuil 0
True