Python使用键排序:可以并行化吗?
假设我有一个列表Python使用键排序:可以并行化吗?,python,multithreading,python-2.7,parallel-processing,Python,Multithreading,Python 2.7,Parallel Processing,假设我有一个列表my_list。 我想对my_list的每个元素进行排序,该元素也是一个列表(我们称之为internal_list) 由于fun在时间上很昂贵,有没有办法并行使用fun计算成本?如果是的话,threading会是一个好的选择吗?由于GIL线程化而导致的AFAIK实际上无法并行完成任务。但是,如果代价高昂是由于迭代了一个长列表中的项目,那么线程化是否有帮助 我还可以用其他什么方法加快速度 注意:我仅限于python 2.7 编辑:添加了详细信息 这是确切的代码fun是get\u
my_list
。
我想对my_list
的每个元素进行排序,该元素也是一个列表(我们称之为internal_list
)
- 由于
在时间上很昂贵,有没有办法并行使用fun
计算成本?如果是的话,fun
会是一个好的选择吗?由于GILthreading
而导致的AFAIK实际上无法并行完成任务。但是,如果代价高昂是由于迭代了一个长列表中的项目,那么线程化
线程化
是否有帮助
- 我还可以用其他什么方法加快速度
fun
是get\u delay
的抽象<代码>图是一个networkx图,每个链接(u,v)
都有一些延迟值
。基本上,我迭代路径上的所有边并计算累积延迟。路径是节点列表。例如,如果path=[1,2,3,4]
,那么(u,v)
链接将是[(1,2)、(2,3)、(3,4)]
要做到这一点,您需要使用一种排序算法,它允许您并行化问题。一个简单的算法是合并排序。这将允许您拆分数据,对部分进行排序,然后以最终的单线程排序方式合并它们。但是,除非缓存值,否则这可能会导致计算两次键。您能否告诉我们更多关于
fun
的功能及其输出是什么(甚至可以发布其代码)?最好的解决方案很可能取决于fun
的确切性质(GIL对它的影响程度,它的输出量有多大,诸如此类)。请参见编辑。fun
将为每个内部列表调用一次。你是对的,线程化
在这里没有帮助。我们是否可以假设my\u list
中的每个内部列表都是唯一的?是的。每个internal\u list
代表一个唯一的路径。旁注:key=lambda internal\u list:fun(internal\u list)
是一种速度较慢、毫无意义的冗长拼写key=fun
。并且不需要将第一个参数切片到zip
zip
在最短iterable用完时停止,因此zip(path[:-1],path[1:])
可以避免不必要的片段,同时与zip(path,path[1:])行为相同。
。还有一个小优化:在Python2上,始终使用itertools.izip
(或者等效地,使用将来的替换zip
。\u内置导入zip
),以避免在只需要迭代压缩输出时出现不必要的临时列表。
def fun(inner_list):
# do some calculation on inner list
time.sleep(1) # simulate expensive operation
return cost
sorted_list = sorted(my_list, key=lambda inner_list: fun(inner_list))
def get_delay(path):
return sum([float(graph.get_edge_data(u, v)['delay']) for u, v in zip(path[:-1], path[1:])])