如果我没有弄错的话,Pandas的内部操作是单线程的。然而,我今天注意到,运行一个简单的程序,如下所示,将产生与正在创建的系统中的CPU核数目相同的线程数。为什么要创建这些额外的线程?
import threading
import pandas as pd
def use_some_cpu(row):
print(f'thread id={threading.get_ident()}')
x = 1.001
for i in range(100000):
x *= 1.001
df = pd.DataFrame(list(range(0, 10000)), columns=['foo'])
df.apply(use_some_cpu, axis=1)如果您试图运行该程序,您将看到输出的所有thred id值都是相同的,这意味着实际的处理是从单个线程完成的。但是,使用htop命令,您将看到程序创建了许多线程(与系统中的核数一样多),并且只有一个内核处于繁忙状态。
在Ubuntu18.04上对大熊猫1.0.2和python 3.7进行了测试。
发布于 2022-03-10 09:56:39
我不能用现代熊猫复制这个:
In [2]: import threading
...: import pandas as pd
...:
...: thread_ids = set()
...:
...: def use_some_cpu(row):
...: thread_ids.add(threading.get_ident())
...: x = 1.001
...: for i in range(100000):
...: x *= 1.001
...:
...: df = pd.DataFrame(list(range(0, 10000)), columns=['foo'])
...: df.apply(use_some_cpu, axis=1)
Out[2]:
0 None
1 None
2 None
3 None
4 None
...
9995 None
9996 None
9997 None
9998 None
9999 None
Length: 10000, dtype: object
In [3]: thread_ids
Out[3]: {140372742666048}然而,现在有几个大熊猫的操作释放了吉尔或允许不同程度的平行下罩,见这个GitHub评论。
https://stackoverflow.com/questions/60843493
复制相似问题