Chcę poznać liczbę procesorów na komputerze lokalnym za pomocą Pythona. Wynik powinien być taki sam, user/real
jak w time(1)
przypadku wywołania za pomocą optymalnie skalowanego programu przeznaczonego tylko dla użytkowników.
python
system-information
phihag
źródło
źródło
/proc/<PID>/status
ma kilka wierszy informujących o liczbie procesorów w bieżącym procesorze: wyszukajCpus_allowed_list
.Odpowiedzi:
Jeśli masz Pythona w wersji> = 2.6, możesz po prostu użyć
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
źródło
os.cpu_count()
Jeśli interesuje Cię liczba procesorów dostępnych dla bieżącego procesu, musisz najpierw sprawdzić cpuset . W przeciwnym razie (lub jeśli cpuset nie jest używany),
multiprocessing.cpu_count()
jest to droga do przejścia w Pythonie 2.6 i nowszych. Następująca metoda odwołuje się do kilku alternatywnych metod w starszych wersjach Pythona:źródło
/proc/self/status
są odpowiednio ff, f i f --- odpowiadające 8, 4 i 4 według (poprawnej) matematyki. Jednak rzeczywista liczba procesorów wynosi odpowiednio 4, 2 i 1. Uważam, że policzenie liczby wystąpień słowa „procesor”/proc/cpuinfo
może być lepszym sposobem. (Czy mam błędne pytanie?)/proc/cpuinfo
stwierdzam, że dla dowolnej z list dla każdego „procesora” mnożymy „rodzeństwo” przez „rdzenie procesora” dostaniesz swój numer „Cpus_allowed”. I rozumiem, że rodzeństwo odnosi się do hiperwątkowości, stąd wasze odniesienie do „wirtualnego”. Ale faktem jest, że twoja liczba „Cpus_allowed” wynosi 8 na moim MacPro, podczas gdy twojamultiprocessing.cpu_count()
odpowiedź to 4. Moje własneopen('/proc/cpuinfo').read().count('processor')
produkują również 4, czyli liczbę rdzeni fizycznych (dwa dwurdzeniowe procesory).open('/proc/self/status').read()
zapomina zamknąć plik.with open('/proc/self/status') as f: f.read()
Zamiast tego użyjos.cpu_count()
with
gdy napotkasz przypadek, w którym go potrzebujesz.Inną opcją jest użycie
psutil
biblioteki, która zawsze okazuje się przydatna w następujących sytuacjach:Powinno to działać na dowolnej platformie obsługiwanej przez
psutil
(Unix i Windows).Należy pamiętać, że w niektórych przypadkach
multiprocessing.cpu_count
może wzrosnąć przez pewienNotImplementedError
czaspsutil
będzie w stanie uzyskać liczbę procesorów. Dzieje się tak po prostu dlatego, żepsutil
najpierw próbuje zastosować te same techniki, których używa,multiprocessing
a jeśli te zawiodą, stosuje również inne techniki.źródło
psutil.cpu_count(logical = True)
psutil.cpu_count()
daje 12 (jest to 6-rdzeniowy procesor z hyperthreading). Wynika to z tego, że domyślnym argumentemlogical
jest Prawda, więc musisz jawnie napisać,psutil.cpu_count(logical = False)
aby uzyskać liczbę fizycznych rdzeni.W Python 3.4+: os.cpu_count () .
multiprocessing.cpu_count()
jest zaimplementowany w kategoriach tej funkcji, ale podnosi się,NotImplementedError
jeślios.cpu_count()
zwracaNone
(„nie można określić liczby procesorów”).źródło
cpu_count
.len(os.sched_getaffinity(0))
może być lepiej, w zależności od celu.os.cpu_count()
prosi OP) może różnić się od liczby procesorów dostępnych dla bieżącego procesu (os.sched_getaffinity(0)
).os.sched_getaffinity(0)
jest dostępny w BSD, więc użycie jest wymagane (bez innej biblioteki zewnętrznej).os.cpu_count()
len(os.sched_getaffinity(0))
jest tym, czego zwykle chceszhttps://docs.python.org/3/library/os.html#os.sched_getaffinity
os.sched_getaffinity(0)
(dodany w Pythonie 3) zwraca zestaw dostępnych procesorów, biorąc pod uwagęsched_setaffinity
wywołanie systemowe Linux , które ogranicza procesory, na których proces i jego potomne mogą działać.0
oznacza uzyskanie wartości dla bieżącego procesu. Funkcja zwraca aset()
dozwolonych procesorów, stąd potrzebalen()
.multiprocessing.cpu_count()
z drugiej strony po prostu zwraca całkowitą liczbę fizycznych procesorów.Różnica jest szczególnie ważna, ponieważ niektóre systemy zarządzania klastrami, takie jak Platform LSF, ograniczają użycie procesora zadania
sched_getaffinity
.Dlatego jeśli używasz
multiprocessing.cpu_count()
, twój skrypt może próbować użyć znacznie większej liczby rdzeni, niż ma dostępnych, co może prowadzić do przeciążenia i przekroczenia limitu czasu.Widzimy różnicę konkretnie, ograniczając powinowactwo z
taskset
użytecznością.Na przykład, jeśli ograniczę Pythona do 1 rdzenia (0 rdzenia) w moim 16-rdzeniowym systemie:
ze skryptem testowym:
main.py
następnie dane wyjściowe to:
nproc
jednak domyślnie szanuje powinowactwo i:wyjścia:
i
man nproc
czyni to całkiem wyraźnym:nproc
ma--all
flagę dla rzadszego przypadku, w którym chcesz uzyskać fizyczną liczbę procesorów:Jedynym minusem tej metody jest to, że wydaje się, że jest to tylko UNIX. Podejrzewam, że Windows musi mieć podobny interfejs API powinowactwa
SetProcessAffinityMask
, więc zastanawiam się, dlaczego nie został przeniesiony. Ale nic nie wiem o systemie Windows.Testowane w Ubuntu 16.04, Python 3.5.2.
źródło
niezależny od platformy:
https://github.com/giampaolo/psutil/blob/master/INSTALL.rst
źródło
psutil.cpu_count(logical=False) #4
psutil.cpu_count(logical=True) #8
imultiprocessing.cpu_count() #8
Dają ci liczbę procesorów hyperthreaded
multiprocessing.cpu_count()
os.cpu_count()
Dają ci liczbę procesorów maszyny wirtualnej
psutil.cpu_count()
numexpr.detect_number_of_cores()
Ma to znaczenie tylko, jeśli pracujesz na maszynach wirtualnych.
źródło
os.cpu_count()
imultiprocessing.cpu_count()
zwróci liczbę procesorów z hiperwątkiem, a nie rzeczywistą fizyczną liczbę procesorów.multiprocessing.cpu_count()
zwróci liczbę logicznych procesorów, więc jeśli masz czterordzeniowy procesor z hyperthreading, zwróci8
. Jeśli chcesz mieć liczbę fizycznych procesorów, użyj hwloc:hwloc jest zaprojektowany tak, aby był przenośny w różnych systemach operacyjnych i architekturach.
źródło
psutil.cpu_count(logical=False)
Nie mogę wymyślić, jak dodać do kodu lub odpowiedzieć na wiadomość, ale oto wsparcie dla Jython, które możesz wprowadzić przed rezygnacją:
źródło
Może to działać dla tych z nas, którzy używają różnych systemów operacyjnych, ale chcą uzyskać to, co najlepsze ze wszystkich światów:
źródło
W tym celu możesz również użyć „joblib”.
Ta metoda da ci liczbę procesorów w systemie. Joblib musi być jednak zainstalowany. Więcej informacji na temat joblib można znaleźć tutaj https://pythonhosted.org/joblib/parallel.html
Alternatywnie możesz użyć pakietu numexpr Pythona. Ma wiele prostych funkcji pomocnych w uzyskiwaniu informacji o procesorze systemowym.
źródło
Inna opcja, jeśli nie masz języka Python 2.6:
źródło