Warum läuft Python-Code mit drastisch unterschiedlichen Geschwindigkeiten trotz zweimaliger Ausführung des gleichen Codes?Python Linie Profiler Ergebnisse inkonsistent
-Code
ich für einen kurzen Python-Code eine Profilierung tat:
import urllib3
@profile
def download(url, file_path):
http = urllib3.PoolManager()
r = http.request("GET", url)
print("FINISHED GET!")
print("WRITING TO "+file_path)
with open(file_path, "wb") as f:
f.write(r.data)
r.release_conn()
url = "http://interactivepaper.todayonline.com/jrsrc/260516/260516.pdf"
download(url, "")
Testing
Ich verwende line_profiler
mit dem Befehl kernprof -l -v test.py
. Ich habe diesen Code mehrmals getestet und alle Ergebnisse sind inkonsistent.
Test 1:
FINISHED GET!
WRITING TO
Wrote profile results to test.py.lprof
Timer unit: 1e-06 s
Total time: 44.653 s
File: test.py
Function: download at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def download(url, file_path):
5 1 273 273.0 0.0 http = urllib3.PoolManager()
6 1 44652667 44652667.0 100.0 r = http.request("GET", url)
7 1 37 37.0 0.0 print("FINISHED GET!")
8 1 4 4.0 0.0 print("WRITING TO "+file_path)
9 1 29 29.0 0.0 with open(file_path, "wb") as f:
10 f.write(r.data)
11 r.release_conn()
(There was an IO Error from here onwards as I used an empty string)
Test 2 (herausgegeben I den Code):
FINISHED GET!
WRITING TO
Wrote profile results to test.py.lprof
Timer unit: 1e-06 s
Total time: 44.6693 s
File: test.py
Function: download at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def download(url, file_path):
5 1 186 186.0 0.0 http = urllib3.PoolManager()
6 1 44669082 44669082.0 100.0 r = http.request("GET", url)
7 1 42 42.0 0.0 print("FINISHED GET!")
8 1 4 4.0 0.0 print("WRITING TO "+file_path)
Test 3:
FINISHED GET!
WRITING TO
Wrote profile results to test.py.lprof
Timer unit: 1e-06 s
Total time: 4.53504 s
File: test.py
Function: download at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def download(url, file_path):
5 1 262 262.0 0.0 http = urllib3.PoolManager()
6 1 4534736 4534736.0 100.0 r = http.request("GET", url)
7 1 37 37.0 0.0 print("FINISHED GET!")
8 1 4 4.0 0.0 print("WRITING TO "+file_path)
Dies ist der Teil, der I verwirrend fand. Ein Prozess, der zuerst 44 Sekunden benötigte, dauert jetzt 4 Sekunden. Ich merkte auch, dass es jedes Mal, wenn ich die Datei bearbeitete, sehr lange dauern würde, um wieder zu laufen. Hier sind drei weitere Tests meinen Punkt zu beweisen:
Erster Test nach edit:
Wrote profile results to test.py.lprof
Timer unit: 1e-06 s
Total time: 49.7018 s
File: test.py
Function: download at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def download(url, file_path):
5 1 187 187.0 0.0 http = urllib3.PoolManager()
6 1 49701585 49701585.0 100.0 r = http.request("GET", url)
Zweiter Test nach edit:
Timer unit: 1e-06 s
Total time: 9.10985 s
File: test.py
Function: download at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def download(url, file_path):
5 1 185 185.0 0.0 http = urllib3.PoolManager()
6 1 9109665 9109665.0 100.0 r = http.request("GET", url)
Dritter Test nach bearbeiten (das ähnlich zu dem zweiten Test):
Wrote profile results to test.py.lprof
Timer unit: 1e-06 s
Total time: 12.9593 s
File: test.py
Function: download at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def download(url, file_path):
5 1 189 189.0 0.0 http = urllib3.PoolManager()
6 1 12959072 12959072.0 100.0 r = http.request("GET", url)