python – 涉及pyqt时文件复制太慢

我正在使用此代码(非常简化的原始版本但问题仍然存在)来复制文件:

def copyfileobj_example(source, dest, buffer_size=1024*1024):
    while 1:
        copy_buffer = source.read(buffer_size)
        if not copy_buffer:
            break
        dest.write(copy_buffer)

如果我在没有pyqt的情况下调用该函数,文件将被快速复制,但是当我在一个简单的pyqt窗口中调用它时,副本速度会慢三倍.

快速复制大量文件是应用程序的主要观点,我假设包括gui会慢一点,但没有让它慢三倍!!并使用线程或多进程运行复制功能不会带来令人满意的改进.

这是一样的吗?你能推荐一些解决这个性能问题的方法吗?

编辑:There是我的实际复制代码的要点,使用和不使用PyQT运行

最佳答案 这可能是
GIL的影响.随着PyQt在UI线程中运行,它每次必须处理事件时“窃取”GIL.这意味着您的循环每次都会停止.当你在另一个线程中运行时也会发生这种情况;锁是全球性的.

解决方法:

>使用更大的缓冲区. Python的C层不受GIL的影响,因此如果复制大量数据,循环中的命令执行频率会降低.
>执行外部命令进行复制(可能是另一个Python进程).
>使用Qt的IO类来复制文件,因为它不受GIL的影响(Kudos到ekhumoro的想法).
>在C中写一段代码来传输数据.
>使用没有像IronPython或Jython这样的GIL的Python版本.

点赞