【问题标题】:Python 3.x replace for loop with something fasterPython 3.x 用更快的方式替换 for 循环
【发布时间】:2019-05-07 12:06:30
【问题描述】:

我正在尝试生成一个表示字符串和列表元素匹配的向量。我在python3.x中做了一个函数:

def vector_build (docs, var):
    vector = []
    features = docs.split(' ')
    for ngram in var:            
        if ngram in features:
            vector.append(docs.count(ngram))
        else:
            vector.append(0)
    return vector

效果很好:

vector_build ('hi my name is peter',['hi', 'name', 'are', 'is'])

输出:[1, 1, 0, 1]

但此功能无法扩展到重要数据。当它的字符串参数 'docs' 大于 190kb 时,它需要更多的时间。所以我试图用 map 函数替换 for 循环,例如:

var = ['hi', 'name', 'are', 'is']
doc = 'hi my name is peter'
features = doc.split(' ')
vector = list(map(var,if ngram in var in features: vector.append(doc.count(ngram))))

但这会返回此错误:

SyntaxError: 无效语法

有没有办法将 for 循环替换为 map、lambda、itertools 以加快执行速度?

【问题讨论】:

  • 我认为您需要查看map 的文档。这不是你将如何执行它。第一个参数是您要使用的函数,其余参数是map 的第一个参数中函数的输入。另外,我认为你走这条路不会有太多收获。
  • 谢谢,您有没有建议更有效的库或函数来加快这个过程?
  • Numpy 可能更快——通常是这样。具体看numpy.isin
  • 我不能使用 numpy,因为它稍后会在 .NET 实例上运行,该实例在读取 python3 的 numpy 时会出现问题。
  • map 和 list-comprehensions 并不比等效的 for 循环快。

标签: python-3.x for-loop time lambda itertools


【解决方案1】:

您可以为此任务使用列表推导。此外,在一组特征中查找也应该对函数有所帮助。

var = ['hi', 'name', 'are', 'is']
doc = 'hi my name is peter'
features = doc.split(' ')
features_set = set(features) #faster lookups
vector = [doc.count(ngram) if ngram in features_set else 0 for ngram in var] 
print(vector)

【讨论】:

  • 它给了我这个指向'for'的错误:SyntaxError: invalid syntax
  • @anitasp 我尝试在我的机器上运行它,并注意到变量“doc”在我未编辑的版本中拼写错误。但是,代码本身似乎很好,我没有收到您遇到的错误。你用的是什么python版本?
  • 列表推导并不比等效的 for 循环快
  • 没注意到你用了一套。您应该突出显示该方面,因为这是您回答的重要方面。我个人只会保留 for 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2018-10-03
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多