python - 在线程中均匀切割嵌套循环的公式是什么?
问题描述
拥有一个数据集,其中每一行都需要结合其他行应用加权函数(交叉连接)。是否应用函数取决于两行中的数据,所以我不能只使用数据库。
因此,在python中实现了一个解决方案。为了提高性能,将应用线程。
现在的问题是,在均匀分布的迭代中拆分数据集的公式是什么,所以每个线程都有几乎相同的工作。
代码的简化版本如下所述。
l = 250000 # number of rows
N = 8 # number of threads
for threadid in range(N):
kstart = ### WHAT IS THE FORMULA TO GIVE EACH THREAD THE SAME WORK
### i.e. the starting index of the next thread begins after the last row of the previous thread
klen =
# Start thread here
#threading.Tread(..., (kstart,klen))
def _threaded(kstart, klen):
for k1 in range(kstart, klen):
for k2 in range(k1, l - k1):
# DoSomething(k1, k2)
pass
例子:
上面显示的循环导致此迭代:
k1 | k2
0 | 0 to 249999 = 250000 iterations in inner loop
1 | 1 to 249999 = 249999 iterations in inner loop
2 | 2 to 249999 = 249998 iterations in inner loop
...
249999 | 249999 = 1 iteration in inner loop
- kstart 的一个简单版本可能是:'l // N * threadid' - 这会将整个集合分布在均匀分布的组中。
线程 1:0 - 31249
线程 2:31250 - 62499
...
线程 8:218750 - 249999
- 现在我们让 k1 在 kstart 上循环,直到下一批的 kstart。
- 现在的问题是,对于小k1,k2要做很多工作。对于大 k1,功几乎为零。
如何更好地为 k1 分割批次,这样呢?
线程 1:0 - 10
线程 2:11 - 100
线程 3:101 - 500
线程 8:128000 - 250000
(这是一个例子,数字不正确)
解决方案
推荐阅读
- c++ - 混淆 C++ 中的 & 和 *
- python - 如何在 Python 中使用 Selenium 在 Chrome 上向下滚动 Youtube 频道
- html - 穆勒莱尔在 Html
- python - 尝试在 AWS Ec2 上部署 pyautogui 爬虫
- docker-desktop - WSL2 提示包含扩展的 WSL 路径?
- html - 导航栏项目在引导程序上不对齐
- r - 尝试打开 RDS 文件时没有名称“图像”错误
- python - Plotly/Dash 以流畅的动画显示实时数据
- apache-flink - 如何引导具有多个状态的 flink 运算符
- ssh - 如何在 NixOS 中使用 GnuPG 代理设置 SSH 关键字缓存?