如何解决使用Python的线程模块调用ctypes函数比使用多处理更快?
我一生都无法解决这个问题。
我写了一个脚本,可以执行数百次繁重的计算。我有一个绝妙的主意,将这些计算任务编写为C ++,然后使用Python的ctypes与它们进行接口。
我自以为是,我什至可以使用并行性进一步优化它。我最初的方法是使用线程。然后我意识到我的任务受CPU限制。因此,仅使用多处理才有意义。好吧,事实证明,多处理模块比线程处理要慢得多,这可能是由于开销所致。
然后我遇到了this。对于那些不想单击粗略链接的人,事实证明ctypes模块绕过了GIL。这意味着我对Python线程的尝试可以实现真正的并行性。
所以我的问题是:官方文档中是否有关于ctypes和GIL的讨论?
我已经附加了用于基准测试线程+ ctypes和多处理的代码。
# Method 1: Using threading
start = time()
threads = []
for arg in args:
threads.append(threading.Thread(target=some_ctypes_func,args=(arg,)))
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print(f"Elapsed time: {time() - start}")
# Method 2: Using multiprocessing
results = []
with Pool(8) as p:
start = time()
for arg in args:
result = p.apply_async(some_ctypes_func,))
results.append(result)
results = [result.get() for result in results]
print(f"Elapsed time: {time() - start}")
使用上面的代码,线程模块比多处理快大约2至3倍。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。