2016-05-26 7 views
0

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) 

Antwort

1

Der Hauptunterschied ist in der folgenden Codezeile:

r = http.request("GET", url) 

In dieser Zeile versuchen Sie, auf den Remote-Webserver zuzugreifen.

Folgende Gründe könnten mit unterschiedlicher Zugriffszeit auf den Web-Server zur Folge hat:

1) Caching

2) Netzwerklast

3) Fernserverbelastung