Wer frisst mehr mechanize oder requests?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

ich habe zwei Varianten geschrieben. Beide Varianten beziehen die gleiche URL und machen das gleiche. Ich möchte bestimmte Werte aus einem Textbox-Control auslesen. Nun möchte ich euch fragen, wer von beiden mehr Speicher "frisst"? Also zeitlich gesehen tun sich beide nichts. Die mechanize-Variante hat ein paar Millisekunden die Nase vorn. Ich würde eher vermuten, dass die requests-Variante mehr "frisst", da noch eine zusätzliche Bibliothek für die gleiche Aufgabe importiert werden muss. Das sind aber nur haltlose Vermutungen. Ich hätte da gerne eure Erfahrungswerte.

Requests-Variante

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup
from datetime import datetime

URL = "http://demos.click4knowledge.com/PHP-login-script-tutorial/login.php"

print "START"

start_time = datetime.now()

info_dict = {}

with requests.Session() as s:
    res = s.get(URL)
    soup = BeautifulSoup(res.content)
    g_data = soup.find_all("input", {"class": "form-control"})
    
    for item in g_data:
        info_dict[item["id"]] = item["value"]

print "username:", info_dict["username"]
print "password:", info_dict["password"]

end_time = datetime.now()

print "END", end_time - start_time
mechanize-Variante

Code: Alles auswählen

import mechanize
from datetime import datetime

URL = "http://demos.click4knowledge.com/PHP-login-script-tutorial/login.php"

print "START"

start_time = datetime.now()

info_dict = {}

br = mechanize.Browser()
br.set_handle_robots(False)
response = br.open(URL)

br.select_form(nr=0)

for control in br.form.controls:
    info_dict[control.name] = control.value

response.close()

print "username:", info_dict["username"]
print "password:", info_dict["password"]

end_time = datetime.now()

print "END", end_time - start_time
Benutzeravatar
snafu
User
Beiträge: 6748
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Schau dir doch einfach den Speicherverbrauch des ausgeführten Python-Interpreters vor und nach dem Import an. Geht z.B. oft über den Taskmanager des Betriebssystems (bzw der verwendeten Desktopumgebung auf Nicht-Windows-Systemen).
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was ist denn der Hintergrund der Frage? Hast du eine akutes Problem mit zu wenig RAM und musst zwingend optimieren?

Gruß, noisefloor
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@snafu: Danke. Darauf hätte ich selbst kommen können. Ich Dussel. Hätte aber sein können, dass eine der Bibliotheken einen bestimmten "Ruf" weg hat. So nach dem Motto "requests ist gut, ABER..." oder "mechanize ist gut, ABER...".

@noisefloor: Ich habe den inneren Drang, mit angezogener Handbremse zu programmieren. Als ich noch in VB6 schrieb, hatte ich bis vor knapp 1-2 Jahren auf meinen alten 800 MHz Rechner mit Windows 2000 Prof. geschrieben. Dort war ich gezwungen "schonend" zu schreiben, und nicht wild drauf los mit den Steuerelementen, kostenspielige Dariantentypen etc. zu verwenden. Nun ist der Rechner hinüber, und sitze an ein einen recht modernen Laptop. Das Programm soll keine (speicher-technisch) Dreckschleuder werden. Und da ich noch weit weit weit weit am Anfang stehe, frage ich lieber euch.
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ok... aber merke: "Premature optimization is the root of all evil" :-)

Gruß, noisefloor
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Mit anderen Worten "Schreibe erst einmal drauf los und hinterher setzt dich nochmal rand und schraubst"? Klingt nach doppelter Arbeit ;-)
BlackJack

@Sophus: Nein, das was Du jetzt gerade machst ist doppelte Arbeit. Du machst Dir Arbeit die wenn sie nicht nötig ist, jetzt umsonst ist. Und falls sie doch nötig sein sollte, ist es egal ob Du sie vorher oder nachher machst, weil sie sowieso anfällt.

Ausserdem gibt es auch noch andere Kriterien. Der Autor von `mechanize` entwickelt das nicht mehr weiter und hat eine Python 3 Portierung AFAIK ausgeschlossen.

Bei BeautifulSoup kann die Antwort nach dem Speicherverbrauch ausserdem davon abhängen welche Bibliothek letztendlich für das Parsen vom HTML verwendet wird. BeautifulSoup macht das ja nicht mehr selber. Bei den unterstützten Parsern ist dann aber auch der Speicherverbrauch nicht das einzige was sich unterscheiden kann. Da geht es auch darum welche Bibliothek mit welchem kaputten HTML wie umgeht oder wie schnell der Parser ist.
Sirius3
User
Beiträge: 17793
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: ja so ist das nunmal. Meist sucht man sich seine Module nach der Funktionalität aus. Gibt es dann irgendwann ein Speicherproblem, fängt man an zu suchen, wo der meiste Speicher verbraucht wird und ob man den reduzieren kann. In 99.999999% der Fälle ist das dann nicht der Code, den ein Modul verbraucht.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Eine dumme Frage: Wo liest man sowas nach, dass ein Autor einer Bibliothek seine Entwicklung eingestellt hat und eine Portierung ausschließt?
Benutzeravatar
snafu
User
Beiträge: 6748
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Habe mal selbst unter Windows getestet: Der Import von `mechanize` oder `requests` sorgt bei mir für einen Anstieg des Speicherverbrauchs von `python.exe` um jeweils ca 5 MB. Dazwischen habe ich den Interpreter jeweils neu gestartet. Importiere ich beide Module hintereinander, dann steigt der Speicherverbauch um insgesamt ca 7 MB.

Gestestet unter Windows 10 und Python 2.7 ganz billig mit dem Befehl ``tasklist | find "python.exe"`` in einer zweiten `cmd.exe` jeweils vor und nach dem Import.

Warum der Import beider Module den Speicherverbrauch um 7 MB und nicht um 10 MB steigen lässt, ist naheliegend: Abhängigkeiten, die von den Modulen importiert werden, können natürlich vom nachfolgend importierten Modul mitgenutzt werden, da einmal geladene Module global verwendet werden.

Insofern sollte man das auch nicht isoliert testen, sondern in Verbindung mit seinem tatsächlichen Programm überprüfen. Und eigentlich sollte man sich über solche Dinge überhaupt keine Gedanken machen, sofern man nicht wirklich gute Gründe dafür hat, dass ein paar MB mehr oder weniger so entscheidend wären.
Benutzeravatar
noisefloor
User
Beiträge: 3875
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Schreibe erst einmal drauf los und hinterher setzt dich nochmal rand und schraubst"? Klingt nach doppelter Arbeit
Meine Sicht der Dinge: sich über (Programmier-) Probleme Gedanken machen, die man de facto nicht hat und auf absehbare Zeit auch nicht haben wird, ist Zeitverschwendung.
Wo liest man sowas nach, dass ein Autor einer Bibliothek seine Entwicklung eingestellt hat und eine Portierung ausschließt?
Im Idealfall auf der Projektseite :-) Ansonsten hilft z.B. auch die Suche nach "name_des_moduls python 3" einen Blogeintrag, eine News-Meldung etc. zu finden.

Gruß, noisefloor
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sophus hat geschrieben:Mit anderen Worten "Schreibe erst einmal drauf los und hinterher setzt dich nochmal rand und schraubst"? Klingt nach doppelter Arbeit ;-)
Keine Sorge die Praxis wird nicht schnell von der naiven Vorstellung befreien, man könnte nach einmal Schreiben zu einem zufriedenstellenden nicht-trivialen Programm kommen.
BlackJack

@Sophus: Nicht selten haben Projekte einen Bugtracker und eine Mailingliste. Da kann man dann auch lesen was der/die Autor(en) so zum einen oder anderen Thema von sich geben. Und vom `mechanize`-Entwickler kam halt bisher das er Python 3 nicht unterstützt, weil er das selber nicht verwendet, und das er nicht mehr zum weiterentwickeln kommt, mit der Frage ob das Projekt jemand übernehmen möchte. Das war Anfang 2012, und es hat anscheinend noch niemand übernehmen wollen.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Schade eigentlich, denn im Grunde ist es eine recht gute Bibliothek - ohne die genauen Einzelheiten unter der Motorhaube zu kennen.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Sophus hat geschrieben:Schade eigentlich, denn im Grunde ist es eine recht gute Bibliothek - ohne die genauen Einzelheiten unter der Motorhaube zu kennen.
Fork das Projekt und führ es weiter! (wie Pillow PIL weiter macht)
the more they change the more they stay the same
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Als Anfänger? Soll ich Selbstmordgedanken bekommen? :D
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Sophus hat geschrieben:Als Anfänger? Soll ich Selbstmordgedanken bekommen? :D
Falsche Einstellung, dabei lernst du was ;).
the more they change the more they stay the same
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Ich finde eher, ihr könnt' das Projekt übernehmen.
Antworten