2017-02-26 86 views
2

我正在尋找一個快速,輕量級的方式從一個Python腳本讀取系統正常運行時間。有沒有辦法從Python調用sysinfo Linux系統調用?最快的方式獲得系統正常運行時間在Python在Linux中

到目前爲止,我已經找到了另外兩種方法測量的正常運行時間,一個涉及運行的外部進程,另一個涉及/proc讀取文件。

import subprocess 

def uptime1(): 
    raw = subprocess.check_output('uptime').decode("utf8").replace(',', '') 
    days = int(raw.split()[2]) 
    if 'min' in raw: 
     hours = 0 
     minutes = int(raw[4]) 
    else: 
     hours, minutes = map(int,raw.split()[4].split(':')) 
    totalsecs = ((days * 24 + hours) * 60 + minutes) * 60 
    return totalsecs 

def uptime2(): 
    with open('/proc/uptime', 'r') as f: 
     uptime_seconds = float(f.readline().split()[0]) 
     return uptime_seconds 

當比較速度,第二種方法是圍繞快50倍。儘管如此,直接調用系統調用應該是另一個更好的數量級。

>> import timeit 
>> print(timeit.timeit('ut.uptime1()', setup="import uptimecalls as ut", number=1000)) 
1.7286969429987948 
>> print(timeit.timeit('ut.uptime2()', setup="import uptimecalls as ut", number=1000)) 
0.03355383600865025 
+1

文件'/ proc中/'不是文件......他們最終都迷上了一些其他的東西讓你設置/獲取不同的東西。如果你願意,你可以在python中加載'.so'文件。但不是0.03s/1000倍足夠快? – HuStmpHrrr

回答

4

我不認爲你可以得到比使用​​快得多打電話給sysinfo()但在我的測試中,它比/ proc慢。那些linux系統程序員似乎知道他們在做什麼!

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 

運行你的兩個測試以及礦上我的慢的筆記本電腦,我得到:

>>> 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 

UPDATE

大部分的時間都花在libc拉動和創建緩衝區。如果您打算長時間重複撥打電話,則可以將這些步驟從功能中拉出來,然後只測量系統呼叫。在這種情況下,該解決方案是明顯的贏家:

uptime1: 5.066633300986723 
uptime2: 0.11561189399799332 
uptime3: 0.007740753993857652 
+0

確實他們會......謝謝。然而,第二個想法是,我相信這可以通過從函數調用中取出第一行或第二行來優化。 – kfx

+1

這是我與庫和緩衝器爲全局變量:uptime1:1.8627383150014794 uptime2:0.03709090399206616 uptime3:0.0018650189886102453 – kfx

+0

但基本上你展示瞭如何從Python中調用C庫函數回答我的問題。 – kfx

4

你可以嘗試安裝psutil

pip install psutil 

,然後用下面的代碼片段:

import psutil 
import time 


def seconds_elapsed(): 
    return time.time() - psutil.BOOT_TIME 


print seconds_elapsed() 
+1

我會感到非常驚訝,這可能是顯著快於方法2:https://github.com/giampaolo/psutil/blob/master/psutil/_pslinux.py#L1255 – HuStmpHrrr

+1

我太多,但也許這是最快的跨平臺和便攜式解決方案,即使OP要求爲linux – JuniorCompressor

+0

這個答案很無聊。這太簡單了! ...(開玩笑)我想說:謝謝你這個很好的答案。 – guettli

相關問題