Jak uzyskać aktualne użycie procesora i pamięci RAM w Pythonie?


333

Jaki jest Twój preferowany sposób uzyskania aktualnego stanu systemu (bieżący procesor, pamięć RAM, wolne miejsce na dysku itp.) W Pythonie? Punkty bonusowe dla platform * nix i Windows.

Wydaje się, że istnieje kilka możliwych sposobów wyodrębnienia tego z mojego wyszukiwania:

  1. Korzystanie z biblioteki takiej jak PSI (która obecnie nie wydaje się aktywnie rozwijana i nie jest obsługiwana na wielu platformach) lub coś w rodzaju pystatgrab (znów brak aktywności od 2007 roku i brak obsługi systemu Windows).

  2. Używanie kodu specyficznego dla platformy, np. Używanie a os.popen("ps")lub podobnego dla systemów * nix oraz MEMORYSTATUSw ctypes.windll.kernel32(patrz ten przepis na ActiveState ) dla platformy Windows. Można umieścić klasę Python razem z tymi wszystkimi fragmentami kodu.

Nie chodzi o to, że te metody są złe, ale czy istnieje już dobrze obsługiwany, wieloplatformowy sposób robienia tego samego?


Możesz zbudować własną bibliotekę wieloplatformową, używając dynamicznych importów: „if sys.platform == 'win32': import win_sysstatus jako sysstatus; w przeciwnym razie” ...
John Fouhy

1
Byłoby fajnie mieć coś, co działa również w App Engine.
Attila O.

Czy wiek paczek jest znaczący? Jeśli ktoś dostał je za pierwszym razem, dlaczego nadal nie mieliby racji?
Paul Smith

Odpowiedzi:


408

Biblioteka psutil poda pewne informacje o systemie (użycie procesora / pamięci) na różnych platformach:

psutil to moduł zapewniający interfejs do pobierania informacji o uruchomionych procesach i wykorzystaniu systemu (procesor, pamięć) w przenośny sposób za pomocą Pythona, implementujący wiele funkcjonalności oferowanych przez narzędzia takie jak ps, top i menedżer zadań Windows.

Obecnie obsługuje systemy Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD i NetBSD, zarówno 32-bitowe, jak i 64-bitowe, z wersjami Pythona od 2.6 do 3.5 (użytkownicy Python 2.4 i 2.5 mogą używać wersji 2.1.3).


AKTUALIZACJA: Oto kilka przykładowych zastosowań psutil:

#!/usr/bin/env python
import psutil
# gives a single float value
psutil.cpu_percent()
# gives an object with many fields
psutil.virtual_memory()
# you can convert that object to a dictionary 
dict(psutil.virtual_memory()._asdict())

33
Pracował dla mnie na OSX: $ pip install psutil; >>> import psutil; psutil.cpu_percent()i >>> psutil.virtual_memory()który zwraca ładny obiekt vmem:vmem(total=8589934592L, available=4073336832L, percent=52.6, used=5022085120L, free=3560255488L, active=2817949696L, inactive=513081344L, wired=1691054080L)
płyty grzewcze

12
Jak można to zrobić bez biblioteki psutil?
BigBrownBear00

2
@ user1054424 W Pythonie jest wbudowana biblioteka o nazwie zasób . Jednak wydaje się, że najwięcej, co możesz z tym zrobić, to wziąć pamięć, której używa pojedynczy proces Pythona i / lub jego procesy potomne. To również nie wydaje się bardzo dokładne. Szybki test wykazał wyłączenie zasobu o około 2 MB w stosunku do narzędzia mojego komputera Mac.
Austin A

12
@ BigBrownBear00 wystarczy sprawdzić źródło psutil;)
Mehulkumar

1
@Jon Cage cześć Jon, czy mogę sprawdzić z tobą różnicę między wolną a dostępną pamięcią? Planuję użyć psutil.virtual_memory (), aby ustalić, ile danych mogę załadować do pamięci do analizy. Dzięki za pomoc!
AiRiFiEd

66

Użyj biblioteki psutil . Na Ubuntu 18.04, pip zainstalował 5.5.0 (najnowsza wersja) od 1-30-2019. Starsze wersje mogą zachowywać się nieco inaczej. Możesz sprawdzić swoją wersję psutil, wykonując to w Pythonie:

from __future__ import print_function  # for Python2
import psutil
print(psutil.__versi‌​on__)

Aby uzyskać statystyki pamięci i procesora:

from __future__ import print_function
import psutil
print(psutil.cpu_percent())
print(psutil.virtual_memory())  # physical memory usage
print('memory % used:', psutil.virtual_memory()[2])

virtual_memory(Krotka) będzie pamięć procent stosowane w całym systemie. Wydawało mi się to być przecenione o kilka procent dla Ubuntu 18.04.

Możesz także uzyskać pamięć używaną przez bieżącą instancję Pythona:

import os
import psutil
pid = os.getpid()
py = psutil.Process(pid)
memoryUse = py.memory_info()[0]/2.**30  # memory use in GB...I think
print('memory use:', memoryUse)

co daje bieżące wykorzystanie pamięci przez twój skrypt Python.

Istnieje kilka bardziej szczegółowych przykładów na stronie pypi dla psutil .


31

Tylko dla Linux: One-liner do wykorzystania pamięci RAM z tylko zależnością stdlib:

import os
tot_m, used_m, free_m = map(int, os.popen('free -t -m').readlines()[-1].split()[1:])

edycja: określona zależność systemu operacyjnego od rozwiązania


1
Bardzo przydatne! Aby otrzymać go bezpośrednio w ludzkich jednostek czytelnych: os.popen('free -th').readlines()[-1].split()[1:]. Zauważ, że ta linia zwraca listę ciągów.
iipr

python:3.8-slim-busterNie mafree
Martin Thoma

21

Poniższe kody, bez bibliotek zewnętrznych działały dla mnie. Testowałem w Pythonie 2.7.9

Użycie procesora

import os

    CPU_Pct=str(round(float(os.popen('''grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage }' ''').readline()),2))

    #print results
    print("CPU Usage = " + CPU_Pct)

I wykorzystanie pamięci RAM, całkowite, używane i bezpłatne

import os
mem=str(os.popen('free -t -m').readlines())
"""
Get a whole line of memory output, it will be something like below
['             total       used       free     shared    buffers     cached\n', 
'Mem:           925        591        334         14         30        355\n', 
'-/+ buffers/cache:        205        719\n', 
'Swap:           99          0         99\n', 
'Total:        1025        591        434\n']
 So, we need total memory, usage and free memory.
 We should find the index of capital T which is unique at this string
"""
T_ind=mem.index('T')
"""
Than, we can recreate the string with this information. After T we have,
"Total:        " which has 14 characters, so we can start from index of T +14
and last 4 characters are also not necessary.
We can create a new sub-string using this information
"""
mem_G=mem[T_ind+14:-4]
"""
The result will be like
1025        603        422
we need to find first index of the first space, and we can start our substring
from from 0 to this index number, this will give us the string of total memory
"""
S1_ind=mem_G.index(' ')
mem_T=mem_G[0:S1_ind]
"""
Similarly we will create a new sub-string, which will start at the second value. 
The resulting string will be like
603        422
Again, we should find the index of first space and than the 
take the Used Memory and Free memory.
"""
mem_G1=mem_G[S1_ind+8:]
S2_ind=mem_G1.index(' ')
mem_U=mem_G1[0:S2_ind]

mem_F=mem_G1[S2_ind+8:]
print 'Summary = ' + mem_G
print 'Total Memory = ' + mem_T +' MB'
print 'Used Memory = ' + mem_U +' MB'
print 'Free Memory = ' + mem_F +' MB'

1
Czy nie uważasz, że grepi awklepiej byłoby załatwione przez ciąg przetwarzania w Pythonie?
Reinderien

Osobiście nie zaznajomiony z awk, stworzyłem nieprzyzwoitą wersję fragmentu użycia procesora poniżej. Bardzo przydatne, dzięki!
Jay

3
Mówienie, że ten kod nie korzysta z bibliotek zewnętrznych, jest nieuczciwe. W rzeczywistości mają one silną zależność od dostępności grep, awk i za darmo. To sprawia, że ​​powyższy kod jest nieprzenośny. OP stwierdził „Punkty bonusowe dla platform * nix i Windows”.
Captain Lepton

10

Oto coś, co przygotowałem jakiś czas temu, są to tylko okna, ale mogą pomóc ci uzyskać część tego, co musisz zrobić.

Pochodzi z: „for sys available mem” http://msdn2.microsoft.com/en-us/library/aa455130.aspx

„informacje o poszczególnych procesach i przykłady skryptów w języku Python” http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true

UWAGA: interfejs / proces WMI jest również dostępny do wykonywania podobnych zadań, nie używam go tutaj, ponieważ obecna metoda pokrywa moje potrzeby, ale jeśli pewnego dnia konieczne będzie jego rozszerzenie lub ulepszenie, może warto sprawdzić dostępne narzędzia WMI .

WMI dla python:

http://tgolden.sc.sabren.com/python/wmi.html

Kod:

'''
Monitor window processes

derived from:
>for sys available mem
http://msdn2.microsoft.com/en-us/library/aa455130.aspx

> individual process information and python script examples
http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true

NOTE: the WMI interface/process is also available for performing similar tasks
        I'm not using it here because the current method covers my needs, but if someday it's needed
        to extend or improve this module, then may want to investigate the WMI tools available.
        WMI for python:
        http://tgolden.sc.sabren.com/python/wmi.html
'''

__revision__ = 3

import win32com.client
from ctypes import *
from ctypes.wintypes import *
import pythoncom
import pywintypes
import datetime


class MEMORYSTATUS(Structure):
    _fields_ = [
                ('dwLength', DWORD),
                ('dwMemoryLoad', DWORD),
                ('dwTotalPhys', DWORD),
                ('dwAvailPhys', DWORD),
                ('dwTotalPageFile', DWORD),
                ('dwAvailPageFile', DWORD),
                ('dwTotalVirtual', DWORD),
                ('dwAvailVirtual', DWORD),
                ]


def winmem():
    x = MEMORYSTATUS() # create the structure
    windll.kernel32.GlobalMemoryStatus(byref(x)) # from cytypes.wintypes
    return x    


class process_stats:
    '''process_stats is able to provide counters of (all?) the items available in perfmon.
    Refer to the self.supported_types keys for the currently supported 'Performance Objects'

    To add logging support for other data you can derive the necessary data from perfmon:
    ---------
    perfmon can be run from windows 'run' menu by entering 'perfmon' and enter.
    Clicking on the '+' will open the 'add counters' menu,
    From the 'Add Counters' dialog, the 'Performance object' is the self.support_types key.
    --> Where spaces are removed and symbols are entered as text (Ex. # == Number, % == Percent)
    For the items you wish to log add the proper attribute name in the list in the self.supported_types dictionary,
    keyed by the 'Performance Object' name as mentioned above.
    ---------

    NOTE: The 'NETFramework_NETCLRMemory' key does not seem to log dotnet 2.0 properly.

    Initially the python implementation was derived from:
    http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true
    '''
    def __init__(self,process_name_list=[],perf_object_list=[],filter_list=[]):
        '''process_names_list == the list of all processes to log (if empty log all)
        perf_object_list == list of process counters to log
        filter_list == list of text to filter
        print_results == boolean, output to stdout
        '''
        pythoncom.CoInitialize() # Needed when run by the same process in a thread

        self.process_name_list = process_name_list
        self.perf_object_list = perf_object_list
        self.filter_list = filter_list

        self.win32_perf_base = 'Win32_PerfFormattedData_'

        # Define new datatypes here!
        self.supported_types = {
                                    'NETFramework_NETCLRMemory':    [
                                                                        'Name',
                                                                        'NumberTotalCommittedBytes',
                                                                        'NumberTotalReservedBytes',
                                                                        'NumberInducedGC',    
                                                                        'NumberGen0Collections',
                                                                        'NumberGen1Collections',
                                                                        'NumberGen2Collections',
                                                                        'PromotedMemoryFromGen0',
                                                                        'PromotedMemoryFromGen1',
                                                                        'PercentTimeInGC',
                                                                        'LargeObjectHeapSize'
                                                                     ],

                                    'PerfProc_Process':              [
                                                                          'Name',
                                                                          'PrivateBytes',
                                                                          'ElapsedTime',
                                                                          'IDProcess',# pid
                                                                          'Caption',
                                                                          'CreatingProcessID',
                                                                          'Description',
                                                                          'IODataBytesPersec',
                                                                          'IODataOperationsPersec',
                                                                          'IOOtherBytesPersec',
                                                                          'IOOtherOperationsPersec',
                                                                          'IOReadBytesPersec',
                                                                          'IOReadOperationsPersec',
                                                                          'IOWriteBytesPersec',
                                                                          'IOWriteOperationsPersec'     
                                                                      ]
                                }

    def get_pid_stats(self, pid):
        this_proc_dict = {}

        pythoncom.CoInitialize() # Needed when run by the same process in a thread
        if not self.perf_object_list:
            perf_object_list = self.supported_types.keys()

        for counter_type in perf_object_list:
            strComputer = "."
            objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
            objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")

            query_str = '''Select * from %s%s''' % (self.win32_perf_base,counter_type)
            colItems = objSWbemServices.ExecQuery(query_str) # "Select * from Win32_PerfFormattedData_PerfProc_Process")# changed from Win32_Thread        

            if len(colItems) > 0:        
                for objItem in colItems:
                    if hasattr(objItem, 'IDProcess') and pid == objItem.IDProcess:

                            for attribute in self.supported_types[counter_type]:
                                eval_str = 'objItem.%s' % (attribute)
                                this_proc_dict[attribute] = eval(eval_str)

                            this_proc_dict['TimeStamp'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.') + str(datetime.datetime.now().microsecond)[:3]
                            break

        return this_proc_dict      


    def get_stats(self):
        '''
        Show process stats for all processes in given list, if none given return all processes   
        If filter list is defined return only the items that match or contained in the list
        Returns a list of result dictionaries
        '''    
        pythoncom.CoInitialize() # Needed when run by the same process in a thread
        proc_results_list = []
        if not self.perf_object_list:
            perf_object_list = self.supported_types.keys()

        for counter_type in perf_object_list:
            strComputer = "."
            objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
            objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")

            query_str = '''Select * from %s%s''' % (self.win32_perf_base,counter_type)
            colItems = objSWbemServices.ExecQuery(query_str) # "Select * from Win32_PerfFormattedData_PerfProc_Process")# changed from Win32_Thread

            try:  
                if len(colItems) > 0:
                    for objItem in colItems:
                        found_flag = False
                        this_proc_dict = {}

                        if not self.process_name_list:
                            found_flag = True
                        else:
                            # Check if process name is in the process name list, allow print if it is
                            for proc_name in self.process_name_list:
                                obj_name = objItem.Name
                                if proc_name.lower() in obj_name.lower(): # will log if contains name
                                    found_flag = True
                                    break

                        if found_flag:
                            for attribute in self.supported_types[counter_type]:
                                eval_str = 'objItem.%s' % (attribute)
                                this_proc_dict[attribute] = eval(eval_str)

                            this_proc_dict['TimeStamp'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.') + str(datetime.datetime.now().microsecond)[:3]
                            proc_results_list.append(this_proc_dict)

            except pywintypes.com_error, err_msg:
                # Ignore and continue (proc_mem_logger calls this function once per second)
                continue
        return proc_results_list     


def get_sys_stats():
    ''' Returns a dictionary of the system stats'''
    pythoncom.CoInitialize() # Needed when run by the same process in a thread
    x = winmem()

    sys_dict = { 
                    'dwAvailPhys': x.dwAvailPhys,
                    'dwAvailVirtual':x.dwAvailVirtual
                }
    return sys_dict


if __name__ == '__main__':
    # This area used for testing only
    sys_dict = get_sys_stats()

    stats_processor = process_stats(process_name_list=['process2watch'],perf_object_list=[],filter_list=[])
    proc_results = stats_processor.get_stats()

    for result_dict in proc_results:
        print result_dict

    import os
    this_pid = os.getpid()
    this_proc_results = stats_processor.get_pid_stats(this_pid)

    print 'this proc results:'
    print this_proc_results

http://monkut.webfactional.com/blog/archive/2009/1/21/windows-process-memory-logging-python


Użyj GlobalMemoryStatusEx zamiast GlobalMemoryStatus, ponieważ stary może zwracać złe wartości.
phobie

7
Powinieneś unikać from x import *stwierdzeń! Zaśmiecają główną przestrzeń nazw i zastępują inne funkcje i zmienne.
phobie

6

Zdecydowaliśmy się użyć do tego zwykłego źródła informacji, ponieważ mogliśmy znaleźć chwilowe wahania wolnej pamięci i uważaliśmy, że zapytanie źródła danych meminfo było pomocne. Pomogło nam to również uzyskać kilka innych powiązanych parametrów, które zostały wstępnie przeanalizowane.

Kod

import os

linux_filepath = "/proc/meminfo"
meminfo = dict(
    (i.split()[0].rstrip(":"), int(i.split()[1]))
    for i in open(linux_filepath).readlines()
)
meminfo["memory_total_gb"] = meminfo["MemTotal"] / (2 ** 20)
meminfo["memory_free_gb"] = meminfo["MemFree"] / (2 ** 20)
meminfo["memory_available_gb"] = meminfo["MemAvailable"] / (2 ** 20)

Wynik w celach informacyjnych (usunęliśmy wszystkie nowe wiersze do dalszej analizy)

MemTotal: 1014500 kB MemFree: 562680 kB MemAvailable: 646364 kB Bufory: 15144 kB Buforowane: 210720 kB SwapCached: 0 kB Aktywne: 261476 kB Nieaktywne: 128888 kB Aktywne (anon): 167092 kB Nieaktywne (anon): 20888 kB Aktywne (plik) : 94384 kB Nieaktywny (plik): 108000 kB Nieprzewidywalny: 3652 kB Zablokowany: 3652 kB Swap Razem: 0 kB Swap Bezpłatnie: 0 kB Brudny: 0 kB Zwrot: 0 kB Anon Strony: 168160 kB Zmapowany: 81352 kB Shmem: 21060 kB Płyta: 34492 kB SR Zgłoszone: 18044 kB Zgłoszenie nienależne: 16448 kB KernelStack: 2672 kB Tabele stron: 8180 kB NFS_Unstable: 0 kB Odrzucenie: 0 kB Zapis zwrotny Tmp: 0 kB CommitLimit: 507248 kB Zatwierdzony_AS: 1038756 kB VmallocBkumulowany: 343597 0 kB AnonHugePages: 88064 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize:2048 kB DirectMap4k: 43008 kB DirectMap2M: 1005568 kB


Wygląda na to, że nie działa zgodnie z oczekiwaniami: stackoverflow.com/q/61498709/562769
Martin Thoma

4

resourceWydaje mi się, że te odpowiedzi zostały napisane dla Pythona 2, aw każdym razie nikt nie wspomniał o standardowym pakiecie, który jest dostępny dla Pythona 3. Udostępnia on komendy pozwalające uzyskać limity zasobów danego procesu (domyślnie wywołujący proces Pythona). Nie jest to równoznaczne z uzyskaniem bieżącego wykorzystania zasobów przez system jako całości, ale może rozwiązać niektóre z tych samych problemów, np. „Chcę się upewnić, że używam X dużo pamięci RAM w tym skrypcie”.


3

„... aktualny stan systemu (bieżący procesor, pamięć RAM, wolne miejsce na dysku itp.)” „Platformy„ nix i Windows ”mogą być trudne do osiągnięcia.

Systemy operacyjne różnią się zasadniczo pod względem sposobu zarządzania tymi zasobami. Rzeczywiście różnią się one w podstawowych pojęciach, takich jak definiowanie tego, co liczy się jako system, a co czasu aplikacji.

"Wolne miejsce na dysku"? Co liczy się jako „miejsce na dysku?” Wszystkie partycje wszystkich urządzeń? Co z zagranicznymi partycjami w środowisku z wieloma systemami?

Nie sądzę, aby istniał wystarczająco wyraźny konsensus między Windows i * nix, który to umożliwi. Rzeczywiście, różne systemy operacyjne o nazwie Windows mogą nawet nie być zgodne. Czy istnieje jeden interfejs API systemu Windows, który działa zarówno w systemie XP, jak i Vista?


4
df -hodpowiada na pytanie dotyczące „miejsca na dysku” zarówno w systemie Windows, jak i * nix.
jfs

4
@JFSebastian: Który system Windows? Otrzymuję komunikat „df” nie został rozpoznany ... komunikat o błędzie z systemu Windows XP Pro. czego mi brakuje?
S.Lott,

3
możesz także instalować nowe programy w systemie Windows.
jfs

2

Ten skrypt do użycia procesora:

import os

def get_cpu_load():
    """ Returns a list CPU Loads"""
    result = []
    cmd = "WMIC CPU GET LoadPercentage "
    response = os.popen(cmd + ' 2>&1','r').read().strip().split("\r\n")
    for load in response[1:]:
       result.append(int(load))
    return result

if __name__ == '__main__':
    print get_cpu_load()

1
  • Aby uzyskać szczegółowe informacje na temat procesora, użyj biblioteki psutil

    https://psutil.readthedocs.io/en/latest/#cpu

  • W przypadku częstotliwości RAM (w MHz) użyj wbudowanego kodu dmidecode biblioteki Linuxa i nieco zmodyfikuj dane wyjściowe;). to polecenie wymaga uprawnień administratora, dlatego też podaj swoje hasło. po prostu skopiuj następujące polecenie zastępując mypass hasłem

import os

os.system("echo mypass | sudo -S dmidecode -t memory | grep 'Clock Speed' | cut -d ':' -f2")

------------------- Wyjście ---------------------------
1600 MT / s
Nieznany
1600 MT / s
Nieznany 0

  • dokładniej
    [i for i in os.popen("echo mypass | sudo -S dmidecode -t memory | grep 'Clock Speed' | cut -d ':' -f2").read().split(' ') if i.isdigit()]

-------------------------- wynik ----------------------- -
[„1600”, „1600”]


dodaj trochę opisu
Paras Korat

1

Aby uzyskać dostęp do pamięci po linii i analizę czasu twojego programu, sugeruję użycie memory_profileri line_profiler.

Instalacja:

# Time profiler
$ pip install line_profiler
# Memory profiler
$ pip install memory_profiler
# Install the dependency for a faster analysis
$ pip install psutil

Wspólne jest to, że za pomocą odpowiednich dekoratorów określasz funkcję, którą chcesz analizować.

Przykład: Mam kilka funkcji w pliku Pythona, main.pyktóre chcę przeanalizować. Jednym z nich jest linearRegressionfit(). Muszę użyć dekoratora, @profilektóry pomaga mi profilować kod w odniesieniu do: Czasu i pamięci.

Wprowadź następujące zmiany w definicji funkcji

@profile
def linearRegressionfit(Xt,Yt,Xts,Yts):
    lr=LinearRegression()
    model=lr.fit(Xt,Yt)
    predict=lr.predict(Xts)
    # More Code

Do czasu profilowania ,

Biegać:

$ kernprof -l -v main.py

Wynik

Total time: 0.181071 s
File: main.py
Function: linearRegressionfit at line 35

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    35                                           @profile
    36                                           def linearRegressionfit(Xt,Yt,Xts,Yts):
    37         1         52.0     52.0      0.1      lr=LinearRegression()
    38         1      28942.0  28942.0     75.2      model=lr.fit(Xt,Yt)
    39         1       1347.0   1347.0      3.5      predict=lr.predict(Xts)
    40                                           
    41         1       4924.0   4924.0     12.8      print("train Accuracy",lr.score(Xt,Yt))
    42         1       3242.0   3242.0      8.4      print("test Accuracy",lr.score(Xts,Yts))

Do profilowania pamięci ,

Biegać:

$ python -m memory_profiler main.py

Wynik

Filename: main.py

Line #    Mem usage    Increment   Line Contents
================================================
    35  125.992 MiB  125.992 MiB   @profile
    36                             def linearRegressionfit(Xt,Yt,Xts,Yts):
    37  125.992 MiB    0.000 MiB       lr=LinearRegression()
    38  130.547 MiB    4.555 MiB       model=lr.fit(Xt,Yt)
    39  130.547 MiB    0.000 MiB       predict=lr.predict(Xts)
    40                             
    41  130.547 MiB    0.000 MiB       print("train Accuracy",lr.score(Xt,Yt))
    42  130.547 MiB    0.000 MiB       print("test Accuracy",lr.score(Xts,Yts))

Wyniki profilera pamięci można również wykreślić przy matplotlibużyciu

$ mprof run main.py
$ mprof plot

wprowadź opis zdjęcia tutaj Uwaga: Testowano na

line_profiler wersja == 3.0.2

memory_profiler wersja == 0,57.0

psutil wersja == 5.7.0



0

W oparciu o kod użycia procesora @Hrabal używam:

from subprocess import Popen, PIPE

def get_cpu_usage():
    ''' Get CPU usage on Linux by reading /proc/stat '''

    sub = Popen(('grep', 'cpu', '/proc/stat'), stdout=PIPE, stderr=PIPE)
    top_vals = [int(val) for val in sub.communicate()[0].split('\n')[0].split[1:5]]

    return (top_vals[0] + top_vals[2]) * 100. /(top_vals[0] + top_vals[2] + top_vals[3])

-12

Nie sądzę, aby dostępna była dobrze obsługiwana biblioteka wieloplatformowa. Pamiętaj, że sam Python jest napisany w C, więc każda biblioteka po prostu podejmie mądrą decyzję o tym, który fragment kodu specyficzny dla systemu operacyjnego ma zostać uruchomiony, jak zasugerowałeś powyżej.


1
Dlaczego ta odpowiedź została odrzucona? Czy to stwierdzenie jest fałszywe?
EAzevedo,

4
ponieważ psutil to dobrze obsługiwana, wieloplatformowa biblioteka, która
najlepiej
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.