Seite 1 von 1

Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 13:33
von Sophus
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

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 13:45
von snafu
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).

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 15:50
von noisefloor
Hallo,

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

Gruß, noisefloor

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 16:02
von Sophus
@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.

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 16:08
von noisefloor
Hallo,

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

Gruß, noisefloor

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 16:21
von Sophus
Mit anderen Worten "Schreibe erst einmal drauf los und hinterher setzt dich nochmal rand und schraubst"? Klingt nach doppelter Arbeit ;-)

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 16:36
von 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.

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 16:42
von Sirius3
@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.

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 16:49
von Sophus
@BlackJack: Eine dumme Frage: Wo liest man sowas nach, dass ein Autor einer Bibliothek seine Entwicklung eingestellt hat und eine Portierung ausschließt?

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 16:59
von snafu
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.

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 17:28
von noisefloor
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

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 17:31
von DasIch
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.

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 18:03
von 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.

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 18:06
von Sophus
Schade eigentlich, denn im Grunde ist es eine recht gute Bibliothek - ohne die genauen Einzelheiten unter der Motorhaube zu kennen.

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 18:51
von Dav1d
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)

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 19:04
von Sophus
Als Anfänger? Soll ich Selbstmordgedanken bekommen? :D

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 20:41
von Dav1d
Sophus hat geschrieben:Als Anfänger? Soll ich Selbstmordgedanken bekommen? :D
Falsche Einstellung, dabei lernst du was ;).

Re: Wer frisst mehr mechanize oder requests?

Verfasst: Freitag 19. Februar 2016, 21:10
von Sophus
Ich finde eher, ihr könnt' das Projekt übernehmen.