Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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_Functional Programming - Fatal编程技术网

Python 如果我使用功能范例对序列进行排序,则为';复印不是浪费吗?

Python 如果我使用功能范例对序列进行排序,则为';复印不是浪费吗?,python,functional-programming,Python,Functional Programming,目标:以功能方式对序列进行排序,而不使用内置的排序(..)功能 def my_sorted(seq): """returns an iterator""" pass 动机:在FP方式中,我受到约束: 永远不要变异seq(可以是迭代器或已实现的列表) 言下之意,没有就地排序 问题1由于我不能变异seq,我需要维护一个单独的可变数据结构来存储排序后的序列。与现有的list.sort()相比,这似乎是浪费。其他函数式编程语言如何处理这个问题 问题2如果我返回一个可变序列,那么在函

目标:以功能方式对序列进行排序,而不使用内置的
排序(..)
功能

def my_sorted(seq):
    """returns an iterator"""
    pass
动机:在FP方式中,我受到约束:

  • 永远不要变异
    seq
    (可以是迭代器或已实现的列表)
  • 言下之意,没有就地排序
问题1由于我不能变异
seq
,我需要维护一个单独的可变数据结构来存储排序后的序列。与现有的
list.sort()
相比,这似乎是浪费。其他函数式编程语言如何处理这个问题


问题2如果我返回一个可变序列,那么在函数范式中是否可以?

使用排序算法,该算法可以以创建新数据结构的方式执行,例如heapsort或mergesort。

当然排序不能完全延迟(输入的最后一个元素可能是输出的第一个元素)但是,您可以实现一种计算惰性排序,在读取整个序列后,只会根据请求逐个元素生成精确排序的输出。您还可以延迟读取输入,直到至少请求一个输出,这样排序和忽略结果将不需要计算


对于这种计算惰性的方法,我所知道的最佳候选方法是heapsort算法(您只需预先执行堆构建步骤)。

只有在没有其他人引用数据的情况下,原地变异才是安全的,因为它与排序之前一样。因此,一般来说,为排序结果建立一个新的结构并不是很浪费。只有以某种方式使用数据时,就地优化才是安全的


因此,只需分配一个新的结构,因为它通常更有用。就地版本是一个特例。

适当的防御性编程有时是浪费,但您也无能为力

这就是为什么为支持功能性使用而构建的语言会对其固有的不可变类型使用结构共享;用一种不是为它而构建的语言(比如Python)进行函数式编程当然不会得到很好的支持。这就是说,排序操作不一定是结构共享的好选择(如果需要进行更多的小更改)


因此,排序中通常至少涉及一个复制操作,即使在其他函数式语言中也是如此。例如,Clojure在临时可变数组上委托Java的本机(高度优化)排序操作,并返回一个封装该数组的seq(从而使结果与用于填充该数组的输入一样不可变)。如果输入是不可变的,而输出是不可变的,并且外部世界(特别是任何其他线程)看不到其间发生的事情,那么瞬态可变性通常是必要且适当的事情。

浪费什么?位?电?挂钟时间?如果有足够的CPU和大量数据,并行合并排序可能是最快完成的,但可能会产生许多中间表示

一般来说,与串行算法相比,并行算法可能导致非常不同的优化策略。例如,根据阿姆达尔定律,在本地重新执行冗余工作以避免共享。这在串行上下文中可能被认为是“浪费”,但会导致更具可伸缩性的算法