【问题标题】:Seeking a fast filter() with removal寻找带移除的快速过滤器()
【发布时间】:2013-09-07 10:39:22
【问题描述】:

我正在尝试编写一个相当快的快速排序,但这在许多其他应用程序中都有使用。

内置的 filter(function, iterable) 函数返回可迭代项的列表,当传递给函数时返回 true,并且当您只需要检查一个条件时,它比传统的 for 循环快得多列表。

我正在寻找的是一个非常快的函数(如过滤器),它不仅会构造一个新列表,还会从旧列表中删除它所获取的项目。在单轴快速排序的应用中,这将允许删除过滤器语句,并且分区例程的速度可能接近 2 倍。

python有内置这样的功能吗? numpy 呢?如果没有,最快的实现方法是什么?

作为参考,这里是当前的分区代码:

def partition(u):
    lesser = singleQuicksort(filter(lambda num: num <= u[0], u[1:]))
    greater = singleQuicksort(filter(lambda num: num > u[0], u[1:]))
    return lesser, greater

【问题讨论】:

    标签: python performance optimization numpy


    【解决方案1】:

    使用布尔掩码:

    def partition(u):
        mask = u[1:] <= u[0]
        return u[1:][mask], u[1:][~mask]
    

    【讨论】:

      【解决方案2】:

      numpy 中,有点像。那是数组索引。当您想“过滤”出inf 时,考虑以下情况:

      a=array([1,2,3,4,inf])
      a[isfinite(a)]
      

      或小于 3 的值

      a=array([1,2,3,4,5])
      a[a>3]
      

      为什么是“某种”?因为索引仍然会创建一个新数组:

      >>> a=array([1,2,3,4,inf])
      >>> a[isfinite(a)]
      array([ 1.,  2.,  3.,  4.])
      >>> id(a)
      40165288 #your result will differ
      >>> id(a[1])
      40253288
      >>> id(a[isfinite(a)][1])
      39747512
      >>> a[1]
      2.0
      >>> a[isfinite(a)][1]
      2.0
      

      【讨论】:

      • 好吧,我仍然希望过滤掉的东西返回。在快速排序中,这将被实现为过滤掉大于枢轴的项目并将它们返回到一个称为更大的列表,然后将剩余部分分配给一个称为较小的列表。这基本上就是我在这里想要做的。
      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2016-10-03
      • 2014-06-06
      • 2012-02-06
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      相关资源
      最近更新 更多