2011-01-08 9 views
3

Ich habe gelesen, answer möglicherweise als die beste Möglichkeit, eine Liste von Zeichenfolgen in Python randomisieren. Ich frage mich nur dann, wenn dies der effizienteste Weg ist, es zu tun, weil ich eine Liste von rund 30 Millionen Elementen über den folgenden Code habe:Zufällige Liste von Millionen von Elementen in Python Effizient

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) 

Wenn es eine effizientere Art und Weise ist, es zu tun, ich Ich schätze jeden Rat, wie es gemacht wird.

Danke,

Antwort

4

Ein paar mögliche Vorschläge:

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) 

.

  • die einzige Möglichkeit zu wissen, ob dies schneller ist, ist es zu profilieren!
  • bevorzugen Sie sets.Stellen Sie das eingebaute Set() aus einem bestimmten Grund?
  • Ich habe eine With-Klausel eingeführt (bevorzugte Möglichkeit, Dateien zu öffnen, da sie garantiert geschlossen werden)
  • Es schien nicht, dass Sie irgendetwas mit 'a' als Liste tun, außer es in ein Set zu konvertieren; Warum nicht gleich von Anfang an ein Set machen?
  • eher auf einem Index als iterieren, dann auf dem Index eine Lookup tun, ich auf den Datenelementen durchlaufen gerade ...
  • , die es leicht als Generator Ausdruck
+0

Danke für den Ratschlag, wie werden Itervalues ​​funktionieren, da ich dachte, Daten sind eine Liste? Und kein Diktat - das scheint auch das Problem zu sein, wenn ich es ausführe: "AttributeError: 'list' Objekt hat kein Attribut 'itervalues'' – eWizardII

+1

Er meinte,' a.update (d ['su'] für d in Daten) Die Methode '.itervalues' ist für Wörterbücher gedacht. Grundsätzlich gibt es keinen Grund für Sie, "Bereich" hier zu verwenden. – milkypostman

2

Wenn Sie denken, Sie wiederbeschreibbar macht Wenn Sie die Zufallswiedergabe durchführen, ist es wahrscheinlich besser, die Lösung aus dieser Datei zu verwenden. Für echt.

randomly mix lines of 3 million-line file

Grundsätzlich ist der Shuffle-Algorithmus hat eine sehr niedrige Periode (das heißt es nicht alle möglichen Kombinationen von 3 Millionen Dateien treffen kann, geschweige denn 30 Millionen). Wenn Sie die Daten in den Speicher laden können, ist Ihre beste Wette, wie sie sagen. Weisen Sie jeder Zeile grundsätzlich eine Zufallszahl zu und sortieren Sie diesen Badboy.

Siehe diesen Thread. Und hier, ich habe es für dich getan, also hast du nichts kaputt gemacht (das ist ein Witz),

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

Ich würde lieber den "Schlüssel" -Parameter der Methode list.sort verwenden, anstatt diese "neue" Liste zu erstellen ... etwas wie: neu = sortiert (a, key = lambda x: random.random()) – Bakuriu

+0

Zwei Probleme mit Ihrer Idee, 1) Lambda ist wirklich langsam, 2) die Sortiermethode wird genau das tun, was ich am Ende vorgeschlagen habe. Wenn Sie dem Sortieralgorithmus 'key' geben, werden nur Tupel' (key, object) 'erzeugt. – milkypostman

Verwandte Themen