Forum: PC-Programmierung Python 3: neue Werte in einer Liste finden


von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Hallo Forum,

Ich schreibe gerade an einem IRC Bot der auf die Streaming Seite 
twitch.tv zugeschnitten ist. Der Bot soll Chats moderieren können.
Geschrieben wird der Bot in Python 3.4.3

Gerade kleine Streamer möchten gerne, das neue Zuschauer erkannt, und 
automatisch begrüßt werden.

Um eine Liste aller aktuellen Zuschauer zu bekommen soll man diesen 
Request benutzen:
1
http://tmi.twitch.tv/group/user/esl_csgo/chatters
"esl_csgo" ist dabei der Name des Kanals, und kann gegen jeden anderen 
twitch-kanal ausgetauscht werden. Der Request kann so in die 
Browserleiste eingegeben werden.

Mit dem Request bekommt man jedes mal eine komplette Liste aller 
aktuellen Zuschauer. Bei kleinen Kanälen ist das alles kein Problem, 
aber bei großen Kanälen (wie jetzt gerade esl_csgo als extrem Beispiel) 
sind jetzt gerade, wo ich das schreibe, 139k Zuschauer eingelogt.
Wie finde ich jetzt am besten einen neuen Zuschauer in dieser Liste?

t = 0: Liste 1 wird erstellt: 139.000 Zuschauer
t = 1: Liste 2 wird erstellt: 139.001 Zuschauer

Muss ich jetzt wirklich 139k mal 139k vergleiche durchführen, um den 
neuen Zuschauer zu finden, oder gibt es da einen besseren Weg?

Die Liste der Zuschauer nach Anfangsbuchstabe splitten bringt meiner 
meinung nach nicht viel, da ich ja immer noch jeden eintrag mit jedem 
vergleichen muss (zumindestens innerhalb der gesplitteten liste)

Selbst wenn ich das ganze in eine Datenbank (SQLite) schreiben würde, 
müsste ich immer noch 139.001 anfragen an die DB schicken um 
festzustellen, ob der Name schon drin steht oder nicht.

Habt Ihr eine Idee ob/wie das besser geht?
Irgendwie steh ich da gerade auf dem Schlauch :-/

Grüße

von Jan H. (j_hansen)


Lesenswert?

Kaj G. schrieb:
> Muss ich jetzt wirklich 139k mal 139k vergleiche durchführen, um den
> neuen Zuschauer zu finden, oder gibt es da einen besseren Weg?

Nein, da gibt es zig andere Möglichkeiten. Listen sortieren und dann 
"gemeinsam" durchgehen, oder die Daten in einen Baum hängen sind nur 
zwei der unzähligen Möglichkeiten. Kannst ja mal ein Algorithmusbuch 
durchblättern.

Oder Google: "compare two lists algorithm", ev. noch mit "python" dazu. 
Python hat da wahrscheinlich schon was fertiges, das du nur noch 
aufrufen musst.

von Lukas K. (carrotindustries)


Lesenswert?

Aus der Liste ein 'set' machen und beide sets voneinander abziehen.
Beispiel:
1
>>> set("abc")-set("abd")
2
{'c'}
3
>>> set("abd")-set("abc")
4
{'d'}
Funktioniert auch noch bei 100e3 Elementen ohne nennenswerte 
Verzögerung.

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Vor dem Sorgenmachen über Effizienz einfach die eingebauten Algorithmen 
ausprobieren.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Ich danke euch :)

set kannte ich noch nicht, macht aber genau das was ich gesucht habe und 
ist exorbitant schneller, als der Elementweise vergleich. Um da mal ne 
hausnummer zu nennen:

Listen mit um die 120k Werte, wobei ca. 4k Werte von Liste2 nicht in 
Liste1 vorkommen. Elementweiservergleich hat 2 Minuten 18 Sekunden 
gedauert, die set Variante ca. 17 Millisekunden.

OS: Linux
CPU: AMD FX 8350

Nochmal vielen Dank für eure Hilfe :)

Grüße

von imon (Gast)


Lesenswert?

Kaj G. schrieb:
> Ich schreibe gerade an einem IRC Bot der auf die Streaming Seite
> twitch.tv zugeschnitten ist. Der Bot soll Chats moderieren können.
> Geschrieben wird der Bot in Python 3.4.3
>
> Gerade kleine Streamer möchten gerne, das neue Zuschauer erkannt, und
> automatisch begrüßt werden.
>
> Um eine Liste aller aktuellen Zuschauer zu bekommen soll man diesen
> Request benutzen:http://tmi.twitch.tv/group/user/esl_csgo/chatters
> "esl_csgo" ist dabei der Name des Kanals, und kann gegen jeden anderen
> twitch-kanal ausgetauscht werden. Der Request kann so in die
> Browserleiste eingegeben werden.

Das ist die liste für den Status quo wer gerade im Chanel ist, die würde 
ich mir ggf auch holen wenn mein bot sich an einen neuen Chanel hängt.
Aber die neuen Benutzer im Chanel sollte dein Bot doch durch die Join 
Meldungen des Chanel mitbekommen, hier die liste von den Webserver zu 
pollen halte ich für Unökonomisch, denn sie sagt deinen Bot nichts was 
er nicht schon im IRC Chanel erfährt und dort auch noch pro User ohne 
das du Riesen listen vergleichen musst.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

imon schrieb:
> Aber die neuen Benutzer im Chanel sollte dein Bot doch durch die Join
> Meldungen des Chanel mitbekommen,
Jein.

Das Join-Event wird nur bis 1000 Zuschauern gesendet, bei mehr 
zuschauern wird es nicht mehr gesendet. Deshalb ist es mMn nicht 
sinnvoll darauf aufzubauen. Es wird sogar (im twitch-dev-forum) 
empfohlen immer die ganze liste zu holen und sich nicht auf das Join zu 
verlassen.
Man "soll" die liste auch nur 1x alle 60 Sekunden holen.

imon schrieb:
> ohne das du Riesen listen vergleichen musst.
Ja, die listen können groß werden, aber wie ich oben schrieb, dauert es 
mit set() nur wenige Millisekunden bei 2 Listen mit jeweils mehr als 
100k zuschauern, also alles im grünen Bereich. :)
Hinzu kommt ja, dass sowohl das Join-Event als auch die Einträge auf der 
Liste nicht in echtzeit erscheinen, es kann mehr als eine Minuten 
dauern, bis ein neuer zuschauer auf der Lsite steht bzw. bis das Join 
gesendet wird.

Aber danke für den Hinweis :)

Hier der Eintrag im Dev-Forum:
https://discuss.dev.twitch.tv/t/users-are-leaving-and-joining-the-channels-randomly/3055

In den unteren Beiträgen wird darauf hingewiesen sich nicht auf das Join 
zu verlassen.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Anmerkung:

imon schrieb:
> Das ist die liste für den Status quo wer gerade im Chanel ist, die würde
> ich mir ggf auch holen wenn mein bot sich an einen neuen Chanel hängt.
Wenn der Bot einen Channel betritt, bekommt er die Liste automatisch 
einmalig. :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.