【问题标题】:How to increase speed of Python computations in large dataset?如何提高大型数据集中 Python 计算的速度?
【发布时间】:2013-12-09 07:45:19
【问题描述】:

我有一个大数据集,它包含与真实网站中的照片对应的标签(500 000条记录,每条至少包含一个标签)

例子:

标签1

标签1 标签2 标签3

tag1 tag12 tag99

等等,500000次

我尝试根据数据集中每个标签的出现次数来计算标签的权重。对于 500 行,代码运行良好(0.1 秒),但对于整个数据,它需要几个小时(超过 8 个),即使对于 PyPy

我认为我做错了什么并且低效地使用 Python。这是计算权重的代码:

for i, photo in enumerate(data):
  for j, tag in enumerate(photo):   
    if (tag not in tag_set):
      tag_set.append(tag)
      tag_w.append(log(len(data)) - log(sum(x.count(tag) for x in data)))

如何加快速度?

谢谢!

【问题讨论】:

  • 你循环数据;到目前为止,您最大的 N 两次,这完全没有必要。我建议使用 defaultdict(0),然后将 defaultdict[tag] += 1 之类的东西放在你的内部循环中。
  • 两次?那不是两次。这与标签的数量一样多。
  • 一个小的改变也是将tag_setlist更改为set。如果 tag_list 很大,这可能会给您带来一些速度上的提升。与其他人建议的那样,与替换循环相比,这不会太多:)
  • 等等,你到底用enumerate 干什么?你没有对索引做任何事情。
  • 你是对的,它来自我过去的循环实现

标签: python performance


【解决方案1】:
x.count(tag) for x in data

这部分循环遍历所有数据中的所有标签。您对每个标签执行一次。这是很多不必要的循环。使用Counterdefaultdict(int) 计算一次标签。如果Counter 仍然很慢,defaultdict(int) 可能会更快,甚至可能只是一个普通的字典。我将使用Counter

import collections
import itertools
tag_counts = collections.Counter(itertools.chain.from_iterable(data))
tag_to_weight_dict = {tag: weight_function(count)
                      for tag, count in tag_counts.items()}

【讨论】:

  • 有效!非常感谢,权重的计算大约需要 5 秒,而不是我自己实现的时间
【解决方案2】:

这样会更快,因为它不会对每个标签重复计数操作:

from math import log
tag_counts = {}
tag_weights = {}

for photo in data:
    for tag in photo:
        tag_counts[tag] = tag_counts.get(tag, 0) + 1

for tag, count in tag_counts.items():
    tag_weights[tag] = log(len(data)) - log(count)

【讨论】:

    【解决方案3】:

    如果我理解正确,您有逗号分隔的值,文件的每行一个 并且您想全局计算每个标签出现的频率,然后计算权重 每个标签都基于您的全局计数。

    正如其他人指出的那样,您在代码的最后一行进行了多余的操作。

    正如另一个回复提到的,您可以从collections.Counter 开始计数。 如果键的数量很大,您可能还可以通过使用来加快速度 numpy.array:

    data_counted = collections.Counter([tag for photo in data for tag in photo])
    data_vec = numpy.array([data_counted[k] for k in data_counted.keys()])
    weights = numpy.subtract(log(len(data)), numpy.log(data_vec))
    

    以上内容并没有真正保留您在data_counted 中的键顺序,但是 可能是一种使用散列函数的方法。 或者完全跳过Counter 步骤,将所有内容直接加载到numpy.array

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多