首页 > 解决方案 > 如何提高 CPU 利用率以在 for 循环中处理数据帧?

问题描述

我有一个包含大约 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%,以便代码可以在几分钟或几小时内完成运行,而不是几天?

标签: pythondataframefor-loopoptimizationgeocoding

解决方案


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

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


推荐阅读