python - 如何提高 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%,以便代码可以在几分钟或几小时内完成运行,而不是几天?
解决方案
你在对着错误的树吠叫。您的代码不受 CPU 限制,而是受 IO 限制(没有进行密集计算,大部分时间都花在了 HTTP 请求上)。
此类问题的典型解决方案是并行化(您可能想看看该multiprocessing
模块),并且它本身在这里很容易实现,因为 - 但是您仍然必须处理您的地理编码 API 速率限制。
推荐阅读
- javascript - 如何修复“对象可能未定义”?
- django - Django Allauth,推特范围
- vue.js - 入口点大小限制:代码拆分以限制 vue cli 3.x 中入口点的大小
- javascript - 当其中一个提取失败时,所有提取都不会显示
- google-ads-api - 如何通过脚本从 adword 活动中排除多个邮政编码?
- powershell - 如果字符串放置在一个序列中而不是不同的序列中,为什么使用 powershell 4.0 在文本文件中搜索字符串会被忽略?
- python - Python“键盘”模块:释放键以允许复制/Ctrl+C
- python - 使用 Python 下载和查看 CSV
- arrays - 用 JQ 读取 Json 数组
- ios - 由于信号 9 Xcode 11 beta,编译命令失败