Python-提高读取/修改/写入速度?
我有一个geoJSON文件,其中包含将某个地理区域细分为约7000个单元格的内容。我想a)打开这个geoJSON b)修改一些数据(见下面的代码),c)将修改后的geoJSON写入磁盘。现在,我的问题是,因为有很多细胞,这几乎需要一分钟。你认为有什么方法可以提高这个功能的速度吗?谢谢大家!Python-提高读取/修改/写入速度?,python,performance,Python,Performance,我有一个geoJSON文件,其中包含将某个地理区域细分为约7000个单元格的内容。我想a)打开这个geoJSON b)修改一些数据(见下面的代码),c)将修改后的geoJSON写入磁盘。现在,我的问题是,因为有很多细胞,这几乎需要一分钟。你认为有什么方法可以提高这个功能的速度吗?谢谢大家! def writeGeoJSON(param1, param2, inputdf): with open('ingeo.geojson') as f: data = json.load
def writeGeoJSON(param1, param2, inputdf):
with open('ingeo.geojson') as f:
data = json.load(f)
for feature in data['features']:
currentfeature = inputdf[(inputdf['SId']==feature['properties']['cellId']) & (inputdf['param1']==param1) & (inputdf['param2']==param2)]
if (len(currentfeature) > 0):
feature['properties'].update({"style": {"opacity": currentfeature.Opacity.item()}})
else:
feature['properties'].update({"style": {"opacity": 0}})
end = time.time()
with open('outgeo.geojson', 'w') as outfile:
json.dump(data, outfile)
您的代码中可能存在串行代码优化。你有一句话:
currentfeature = inputdf[(inputdf['SId']==feature['properties']['cellId']) & (inputdf['param1']==param1) & (inputdf['param2']==param2
请注意,最后两个检查可以放在for
循环之外。这是一个冗余检查,在for
循环中的每次迭代都会占用许多CPU时钟周期!!!
您可以将其修改为:
paramMatch=inputdf['param1']==param1 & inputdf['param2']==param2
for feature in data['features']:
currentfeature = inputdf[(inputdf['SId']==feature['properties']['cellId']) & paramMatch]
这一定会让你的程序运行得更快
也就是说,如果您需要更好的执行时间(很可能不是必需的),请尝试使用多处理
模块来并行化代码的处理部分。您可以尝试在for
循环中拆分工作负载
尝试使用
apply\u async
或map\u async
来加速迭代块 您的代码中可能存在串行代码优化。你有一句话:
currentfeature = inputdf[(inputdf['SId']==feature['properties']['cellId']) & (inputdf['param1']==param1) & (inputdf['param2']==param2
请注意,最后两个检查可以放在for
循环之外。这是一个冗余检查,在for
循环中的每次迭代都会占用许多CPU时钟周期!!!
您可以将其修改为:
paramMatch=inputdf['param1']==param1 & inputdf['param2']==param2
for feature in data['features']:
currentfeature = inputdf[(inputdf['SId']==feature['properties']['cellId']) & paramMatch]
这一定会让你的程序运行得更快
也就是说,如果您需要更好的执行时间(很可能不是必需的),请尝试使用多处理
模块来并行化代码的处理部分。您可以尝试在for
循环中拆分工作负载
尝试使用
apply\u async
或map\u async
来加速迭代块 [除了@varun优化,还包括@romain aga建议。]
在函数开头添加以下内容:
zero_style = {"opacity": 0}
并将条件更改为:
if (len(currentfeature) > 0):
feature['properties']['style'] = {"opacity": currentfeature.Opacity.item()}
else:
feature['properties']['style'] = zero_style
我的印象是,更多地了解inputdf
类型将导致更好的优化(如果currentfeature:足够了,可能直接,可能更好?)
假设是CPython,我希望这会更好(请求原谅比请求允许更好):
[除了@varun优化之外,还包括@romain aga建议。]
在函数开头添加以下内容:
zero_style = {"opacity": 0}
并将条件更改为:
if (len(currentfeature) > 0):
feature['properties']['style'] = {"opacity": currentfeature.Opacity.item()}
else:
feature['properties']['style'] = zero_style
我的印象是,更多地了解inputdf
类型将导致更好的优化(如果currentfeature:
足够了,可能直接,可能更好?)
假设是CPython,我希望这会更好(请求原谅比请求允许更好):
可能在循环之外计算inputdf[(inputdf['param1']==param1)&(inputdf['param2']==param2)]
。首先,您的函数要确定瓶颈是否在i/o或处理中。其他的都是在海里钓鱼dark@Alex杰出的我在回答中也提到了同样的一点。我在问题发布的那一刻就注意到了。。。我花了9分钟从手机上回答这个问题!XD您是否尝试将此{“style”:{“opacity”:0}}
存储在常量中?不确定您是否能从中获得一些性能,但是如果每次Python都必须重新创建这个对象,那么肯定会更快。另外,feature['properties']
将此项存储到变量中可能会有所帮助。但我也不确定。Python访问值的速度可能比创建变量的速度还要快,再加上访问权限。只要做一些测试。@romain aga我想你不能将{“style”:{“opacity”:0}}
存储在一个常量中,因为这不是一个变量,而是告诉程序要更新JSON的哪些字段。可以在循环之外计算inputdf[(inputdf['param1']==param1)和(inputdf['param2']==param2)]
。首先,您的函数用于确定瓶颈是否在i/o或处理中。其他的都是在海里钓鱼dark@Alex杰出的我在回答中也提到了同样的一点。我在问题发布的那一刻就注意到了。。。我花了9分钟从手机上回答这个问题!XD您是否尝试将此{“style”:{“opacity”:0}}
存储在常量中?不确定您是否能从中获得一些性能,但是如果每次Python都必须重新创建这个对象,那么肯定会更快。另外,feature['properties']
将此项存储到变量中可能会有所帮助。但我也不确定。Python访问值的速度可能比创建变量的速度还要快,再加上访问权限。只需做一些测试。@romain aga我认为您不能将{“style”:{“opacity”:0}}
存储在常量中,因为这不是一个变量,而是告诉程序要更新JSON的哪些字段。谢谢,这将运行时间缩短了60%!我也会尽量让它并行运行令人惊叹的!如果您使用的是Cpython(默认的Python发行版),请确保避免使用Threading
模块,并使用multiprocessing
模块。否则,这也是一个选择!是的,我以前在一些uni作业中使用过多处理
,所以我很熟悉:)据我所知,线程
并不能真正实现GIL的并行计算bc.)很好,m8!祝你一切顺利汉克斯,那就减少了60%的跑步时间!我也会尽量让它并行运行令人惊叹的!如果您使用的是Cpython(默认的Python发行版),请确保避免使用Threading
模块,并使用multiprocessing
模块。否则,这也是一个选择!是的,我以前在一些uni作业中使用过多处理
,所以我很熟悉:)据我所知,线程
并不能真正实现GIL的并行计算bc.)很好,m8!祝你一切顺利D+1用于详细观测