Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-提高读取/修改/写入速度?_Python_Performance - Fatal编程技术网

Python-提高读取/修改/写入速度?

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

我有一个geoJSON文件,其中包含将某个地理区域细分为约7000个单元格的内容。我想a)打开这个geoJSON b)修改一些数据(见下面的代码),c)将修改后的geoJSON写入磁盘。现在,我的问题是,因为有很多细胞,这几乎需要一分钟。你认为有什么方法可以提高这个功能的速度吗?谢谢大家!

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用于详细观测