如何提高 CPU 在 for 循环中处理数据帧的利用率?

How do I increase CPU utilization for processing a dataframe in for loop?

我有一个包含大约 200,000 个地址的数据集,我想对其进行地理编码(即查找其经纬度)。我的(简化的)代码如下:

import pandas as pd
import numpy as np

df = pd.read_csv('dataset.csv')
Latitudes = np.zeros(len(df))
Longitudes = np.zeros(len(df))

def geocode_address(address):
    ### The logic for geocoding an address
    ### and return its latitude and longitude

for i in range(len(df)):
    try:
        lat, lon = geocode_address(df.Address[i])
    except:
        lat = lon = ''
    Latitudes[i] = lat
    Longitudes[i] = lon

问题是每一行(地址)大约需要 1-1.3 秒来进行地理编码,因此此代码至少需要几天才能完成 运行 整个数据集。我在 Windows 10 的 jupyter notebook 上 运行 这个。当我查看任务管理器时,我看到进程 jupyter.exe 只占用了 0.3-0.7%的 CPU! 我认为这是非常低的。我在看错误的过程吗?如果不是,我如何将此代码的 CPU 利用率提高到至少 50%,以便代码可以在几分钟或几小时内完成 运行 而不是花费几天?

你对着错误的树吠叫。您的代码不受 CPU 约束,它受 IO 约束(没有进行密集计算,大部分时间都花在执行 HTTP 请求上)。

此类问题的规范解决方案是并行化(您可能想看看 multiprocessing 模块),它本身很容易在这里实现,因为 - 但您仍然需要处理使用您的地理编码 API 速率限制。

我根据 B运行o 的建议解决了这个问题,方法是将数据分成 10 个子集,每个子​​集有 20k 行。然后我 运行 10 个 jupyter notebooks 在每个分区上都有相同的代码。这基本上是 "stone age parallel processing",但它确实以简单的方式解决了问题 - 整个工作在大约 5 小时内完成。

但要记住的关键是注意每个笔记本占用了多少 CPU - 在我的例子中,大约是 1%。因此,从理论上讲,我可以将数据分成 50 个部分,整个任务将在大约一个小时内完成。但是,如果每个笔记本占用 CPU 的 10%,那么最多我会将数据分成 6-7 个部分,因为我想保留至少 30-40% 的 CPU 用于其他应用程序和进程。

我很想知道是否有一种方法可以自动执行此过程 - 即找到最大分区数是多少,这样当 运行 在每个分区上使用同一个笔记本时,总 CPU 使用不超过指定的阈值。然后,当然,对数据和 运行 代码进行分区。