【问题标题】:Random List of millions of elements in Python EfficientlyPython中数百万个元素的随机列表有效
【发布时间】:2011-06-05 15:30:12
【问题描述】:

我已阅读此answer,这可能是在 Python 中随机化字符串列表的最佳方式。我只是想知道这是否是最有效的方法,因为我通过以下代码获得了大约 3000 万个元素的列表:

import json
from sets import Set
from random import shuffle

a = []

for i in range(0,193):
    json_data = open("C:/Twitter/user/user_" + str(i) + ".json")
    data = json.load(json_data)
    for j in range(0,len(data)):
        a.append(data[j]['su'])
new = list(Set(a))
print "Cleaned length is: " + str(len(new))

## Take Cleaned List and Randomize it for Analysis
shuffle(new)

如果有更有效的方法可以做到这一点,我将非常感谢任何关于如何做到这一点的建议。

谢谢,

【问题讨论】:

    标签: python list random performance shuffle


    【解决方案1】:

    几个可能的建议:

    import json
    from random import shuffle
    
    a = set()
    for i in range(193):
        with open("C:/Twitter/user/user_{0}.json".format(i)) as json_data:
            data = json.load(json_data)
            a.update(d['su'] for d in data)
    
    print("Cleaned length is {0}".format(len(a)))
    
    # Take Cleaned List and Randomize it for Analysis
    new = list(a)
    shuffle(new)
    

    .

    • 了解这是否更快的唯一方法是对其进行分析!
    • 出于某种原因,您更喜欢 sets.Set 到内置的 set() 吗?
    • 我引入了 with 子句(打开文件的首选方式,因为它保证它们会被关闭)
    • 除了将其转换为集合之外,您似乎没有对“a”作为列表进行任何操作;为什么不从一开始就做一套呢?
    • 而不是迭代索引,然后查找索引,我只是迭代数据项...
    • 这使得它可以很容易地重写为生成器表达式

    【讨论】:

    • 感谢您的建议,既然我认为数据是一个列表,那么 itervalues 将如何工作?而不是 dict - 当我运行它时这似乎也是问题:AttributeError: 'list' object has no attribute 'itervalues'
    • 他的意思是,'a.update(d['su'] for d in data)' 方法.itervalues 用于字典。基本上你没有理由在这里使用range
    【解决方案2】:

    如果您认为要进行随机播放,最好使用此文件中的解决方案。对于realz。

    randomly mix lines of 3 million-line file

    基本上,shuffle 算法的周期非常短(这意味着它无法命中 300 万个文件的所有可能组合,更不用说 3000 万个)。如果您可以将数据加载到内存中,那么最好的选择就是他们所说的。基本上为每一行分配一个随机数并对那个坏男孩进行排序。

    看到这个线程。在这里,我为你做了,所以你没有搞砸任何事情(这是个笑话),

    import json
    import random
    from operator import itemgetter
    
    a = set()
    for i in range(0,193):
        json_data = open("C:/Twitter/user/user_" + str(i) + ".json")
        data = json.load(json_data)
        a.update(d['su'] for d in data)
    
    print "Cleaned length is: " + str(len(new))
    
    new = [(random.random(), el) for el in a]
    new.sort()
    new = map(itemgetter(1), new)
    

    【讨论】:

    • 我宁愿使用 list.sort 方法的“key”参数,而不是构建那个“new”,list...类似于:new = sorted(a, key=lambda x: random.random())
    • 您的想法有两个问题,1) lambda 真的很慢,2) sort 方法将完全按照我最后的建议进行。基本上,当您向排序算法提供key 时,它所做的只是创建(key, object) 元组。
    【解决方案3】:

    我不知道它是否会更快,但你可以试试numpy's shuffle

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 2019-04-26
      • 2014-06-12
      • 1970-01-01
      • 2017-11-10
      • 2021-02-19
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多