Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Python 2.7_Parallel Processing - Fatal编程技术网

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
    计算成本?如果是的话,
    threading
    会是一个好的选择吗?由于GIL
    线程化
    而导致的AFAIK实际上无法并行完成任务。但是,如果代价高昂是由于迭代了一个长列表中的项目,那么
    线程化
    是否有帮助
  • 我还可以用其他什么方法加快速度
注意:我仅限于python 2.7

编辑:添加了详细信息

这是确切的代码
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:])])