Ich glaube nicht, dass Sie viel schneller werden können als mit ctypes
um sysinfo()
anzurufen aber in meinen Tests ist es langsamer als /proc. Diese Linux-Systemprogrammierer scheinen zu wissen, was sie tun!
import ctypes
import struct
def uptime3():
libc = ctypes.CDLL('libc.so.6')
buf = ctypes.create_string_buffer(4096) # generous buffer to hold
# struct sysinfo
if libc.sysinfo(buf) != 0:
print('failed')
return -1
uptime = struct.unpack_from('@l', buf.raw)[0]
return uptime
Als ich Ihre beiden Tests plus meinen auf meinem langsamen Laptop ausgeführt habe, habe ich Folgendes erhalten:
>>> print(timeit.timeit('ut.uptime1()', setup="import uptimecalls as ut", number=1000))
5.284219555993332
>>> print(timeit.timeit('ut.uptime2()', setup="import uptimecalls as ut", number=1000))
0.1044210599939106
>>> print(timeit.timeit('ut.uptime3()', setup="import uptimecalls as ut", number=1000))
0.11733305400412064
AKTUALISIEREN
Die meiste Zeit wird damit verbracht, libc
einzuziehen und Erstellen des Puffers. Wenn Sie den Aufruf im Laufe der Zeit wiederholt durchführen möchten, können Sie diese Schritte aus der Funktion herausziehen und nur den Systemaufruf messen. In diesem Fall ist diese Lösung der klare Gewinner:
uptime1: 5.066633300986723
uptime2: 0.11561189399799332
uptime3: 0.007740753993857652
Sie können versuchen, psutil
zu installieren mit:
pip install psutil
und verwenden Sie dann das folgende Codefragment:
import psutil
import time
def seconds_elapsed():
return time.time() - psutil.boot_time()
print seconds_elapsed()
Dies scheint offen gesagt eine viel bessere Lösung zu sein:
def get_uptime():
with open('/proc/uptime', 'r') as f:
uptime_seconds = float(f.readline().split()[0])
return uptime_seconds
Es hat auch den zusätzlichen Vorteil, dass keine zusätzlichen Module erforderlich sind.
Danksagungen:Quelle