Случайный список миллионов элементов в Python эффективно - PullRequest
3 голосов
/ 08 января 2011

Я прочитал этот ответ потенциально как лучший способ рандомизировать список строк в Python.Мне просто интересно, если это самый эффективный способ сделать это, потому что у меня есть список около 30 миллионов элементов с помощью следующего кода:

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)

Если есть более эффективный способ сделать это,Буду очень признателен за любые советы о том, как это сделать.

Спасибо,

Ответы [ 3 ]

4 голосов
/ 08 января 2011

Пара возможных предложений:

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)

.

  • единственный способ узнать, быстрее ли это, - это профилировать его!
  • вы предпочитаете наборы. Установите для встроенного набора () по причине?
  • Я ввел предложение with (предпочтительный способ открытия файлов, поскольку он гарантирует их закрытие)
  • не похоже, что вы делали что-либо с 'a' в качестве списка, за исключением преобразования его в набор; почему бы не сделать это набором с самого начала?
  • вместо итерации по индексу, а затем поиска по индексу, я просто перебираю элементы данных ...
  • , что делает его легко перезаписываемым в качестве выражения генератора
2 голосов
/ 08 января 2011

Если вы думаете, что собираетесь использовать shuffle, вам, вероятно, лучше использовать решение из этого файла. Для realz.

случайное смешивание строк файла с 3 миллионами строк

По сути, алгоритм перемешивания имеет очень низкий период (то есть он не может найти все возможные комбинации из 3 миллионов файлов, не говоря уже о 30 миллионах). Если вы можете загрузить данные в память, то лучше всего, как говорится. В основном присвойте случайное число каждой строке и сортируйте этого плохого парня.

Смотрите эту тему. И вот, я сделал это для вас, чтобы вы ничего не испортили (это шутка),

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)
0 голосов
/ 08 января 2011

Я не знаю, будет ли это быстрее, но вы можете попробовать numpy's shuffle .

...