python中的快速过滤方法

python中的快速过滤方法,python,list,filter,Python,List,Filter,我想用python脚本中任何最快的方法过滤两个列表。为此,我使用了内置的filter()方法。但这是相当缓慢的,需要太多的时间,因为我有一个非常大的列表,我认为在每个列表中超过500万项,或者可能更多。 我不知道该怎么做。请如果有人有想法或写它的小功能 我想filter()是最快的,无需用C编写过滤函数(在这种情况下,最好用C编写整个过滤过程) 为什么不粘贴正在筛选的函数?这可能会导致更容易的优化 阅读Python中的优化。关于Python/C API。我想filter()是您不必用C编写过滤函

我想用python脚本中任何最快的方法过滤两个列表。为此,我使用了内置的
filter()
方法。但这是相当缓慢的,需要太多的时间,因为我有一个非常大的列表,我认为在每个列表中超过500万项,或者可能更多。 我不知道该怎么做。请如果有人有想法或写它的小功能

我想filter()是最快的,无需用C编写过滤函数(在这种情况下,最好用C编写整个过滤过程)

为什么不粘贴正在筛选的函数?这可能会导致更容易的优化

阅读Python中的优化。关于Python/C API。

我想filter()是您不必用C编写过滤函数就能获得的最快速度(在这种情况下,您最好用C编写整个过滤过程)

为什么不粘贴正在筛选的函数?这可能会导致更容易的优化


阅读Python中的优化。关于Python/capi。

可能您的列表太大,无法放入内存,您会遇到一些问题。 如果源位于文件中,则不需要一次将整个列表全部存储在内存中。尝试使用,例如:

请注意,ifilter返回一个快速且内存高效的迭代器


这是David M.Beazley的一个教程,教授了生成器的一些有趣的用法。

可能您的列表太大,无法放入内存,并且您有经验。 如果源位于文件中,则不需要一次将整个列表全部存储在内存中。尝试使用,例如:

请注意,ifilter返回一个快速且内存高效的迭代器


这是David M.Beazley的一个教程,教你如何使用生成器。

在用C语言编写之前,你可以试试。也许您可以将过滤转换为数字运算。

在使用C语言之前,您可以尝试一下。也许你可以把你的过滤变成数字运算。

过滤器会创建一个新的列表,所以如果你原来的列表很大,你最终可能会使用两倍的内存。 如果您只需要迭代地处理结果,而不是将其用作真正的随机访问列表,那么使用 我改为过滤。即

for x in itertools.ifilter(condition_func, my_really_big_list):
    do_something_with(x)
其他速度技巧是使用python内置函数,而不是您自己编写的函数。有一个itertools.ifilterfalse专门针对
在这种情况下,您需要引入lambda来否定您的支票。(例如,“ifilter(lambda x:not x.isalpha(),l)”应该写为“ifilterfalse(str.isalpha,l)”)

过滤器将创建一个新列表,因此如果您的原始列表非常大,您最终可能会使用两倍的内存。 如果您只需要迭代地处理结果,而不是将其用作真正的随机访问列表,那么使用 我改为过滤。即

for x in itertools.ifilter(condition_func, my_really_big_list):
    do_something_with(x)
其他速度技巧是使用python内置函数,而不是您自己编写的函数。有一个itertools.ifilterfalse专门针对
在这种情况下,您需要引入lambda来否定您的支票。(例如,“ifilter(lambda x:not x.isalpha(),l)”应写为“ifilterfalse(str.isalpha,l)”)

了解条件列表理解通常比相应的lambda快得多可能会有用:

>>> import timeit
>>> timeit.Timer('[x for x in xrange(10) if (x**2 % 4) == 1]').timeit()
2.0544309616088867
>>> timeit.f = lambda x: (x**2 % 4) == 1
timeit.Timer('[x for x in xrange(10) if f(x)]').timeit()
>>> 
3.4280929565429688

(不知道为什么我需要在
timeit
名称空间中输入f,在那里。我没有太多地使用该模块。)

了解条件列表理解通常比相应的lambda快得多,这可能很有用:

>>> import timeit
>>> timeit.Timer('[x for x in xrange(10) if (x**2 % 4) == 1]').timeit()
2.0544309616088867
>>> timeit.f = lambda x: (x**2 % 4) == 1
timeit.Timer('[x for x in xrange(10) if f(x)]').timeit()
>>> 
3.4280929565429688

(不知道为什么我需要在
timeit
名称空间中添加f,在那里。实际上没有太多地使用该模块。)

如果你能避免首先创建列表,你会更快乐

而不是

aBigList = someListMakingFunction()
filter( lambda x:x>10, aBigList )
您可能希望查看生成列表的函数

def someListMakingGenerator( ):
    for x in some source:
        yield x
那么你的过滤器就不会涉及到大量的记忆了

def myFilter( aGenerator ):
    for x in aGenerator:
        if x > 10: 
            yield x

通过使用生成器,您不会在内存中保留太多内容。

如果您可以避免首先创建列表,您会更快乐

而不是

aBigList = someListMakingFunction()
filter( lambda x:x>10, aBigList )
您可能希望查看生成列表的函数

def someListMakingGenerator( ):
    for x in some source:
        yield x
那么你的过滤器就不会涉及到大量的记忆了

def myFilter( aGenerator ):
    for x in aGenerator:
        if x > 10: 
            yield x

通过使用生成器,您不会在内存中保留太多内容。

您的两个链接都已失效。您的两个链接都已失效。我只运行了以下两行进行比较:[e代表lst中的e,如果在olist中为e[1]则在olist中为e]。我只是比较了下面两行:[e代表lst中的e,如果e[1]代表olist]#过滤器(lambda e:e[1]代表olist,lst)。他们都花了完全相同的(痛苦的)时间。