Saya ingin tahu jumlah CPU pada mesin lokal menggunakan Python. Hasilnya harus berupa user/real
keluaran time(1)
saat dipanggil dengan program yang khusus untuk pengguna-spasi yang optimal.
python
system-information
phihag
sumber
sumber
/proc/<PID>/status
memiliki beberapa baris yang memberitahu Anda jumlah CPU di cpuset saat ini: cariCpus_allowed_list
.Jawaban:
Jika Anda memiliki python dengan versi> = 2.6, Anda cukup menggunakan
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
sumber
os.cpu_count()
Jika Anda tertarik dengan jumlah prosesor yang tersedia untuk proses Anda saat ini, Anda harus memeriksa cpuset terlebih dahulu. Kalau tidak (atau jika cpuset tidak digunakan),
multiprocessing.cpu_count()
adalah cara untuk menggunakan Python 2.6 dan yang lebih baru. Metode berikut jatuh kembali ke beberapa metode alternatif di versi Python yang lebih lama:sumber
/proc/self/status
masing-masing adalah ff, f dan f --- sesuai dengan 8, 4 dan 4 dengan matematika Anda (benar). Namun sebenarnya jumlah CPU masing-masing adalah 4, 2 dan 1. Saya menemukan bahwa menghitung jumlah kemunculan kata "prosesor" di/proc/cpuinfo
mungkin merupakan cara yang lebih baik. (Atau apakah saya memiliki pertanyaan yang salah?)/proc/cpuinfo
itu jika untuk salah satu daftar untuk setiap "prosesor" Anda mengalikan "saudara" dengan "inti cpu" Anda mendapatkan nomor "Cpus_allowed" Anda. Dan saya berpendapat bahwa saudara kandung mengacu pada hyper-threading, maka referensi Anda untuk "virtual". Tetapi faktanya tetap bahwa nomor "Cpus_allowed" Anda adalah 8 pada MacPro saya sedangkanmultiprocessing.cpu_count()
jawaban Anda adalah 4. Milik sayaopen('/proc/cpuinfo').read().count('processor')
juga menghasilkan 4, jumlah inti fisik (dua prosesor dual-core).open('/proc/self/status').read()
lupa untuk menutup file. Gunakanwith open('/proc/self/status') as f: f.read()
sebagai gantinyaos.cpu_count()
with
ketika Anda menemukan kasus di mana Anda membutuhkannya.Pilihan lain adalah menggunakan
psutil
perpustakaan, yang selalu bermanfaat dalam situasi ini:Ini harus bekerja pada platform apa pun yang didukung oleh
psutil
(Unix dan Windows).Perhatikan bahwa dalam beberapa kesempatan
multiprocessing.cpu_count
dapat menaikkan beberapaNotImplementedError
saatpsutil
akan dapat memperoleh jumlah CPU. Ini hanya karenapsutil
pertama kali mencoba menggunakan teknik yang sama yang digunakan olehmultiprocessing
dan, jika gagal, itu juga menggunakan teknik lain.sumber
psutil.cpu_count(logical = True)
psutil.cpu_count()
memberikan 12 (ini adalah CPU 6-core dengan hyperthreading). Ini karena argumen defaultlogical
adalah Benar, jadi Anda secara eksplisit perlu menulispsutil.cpu_count(logical = False)
untuk mendapatkan jumlah Core fisik.Dalam Python 3.4+: os.cpu_count () .
multiprocessing.cpu_count()
diimplementasikan dalam hal fungsi ini tetapi menimbulkanNotImplementedError
jikaos.cpu_count()
kembaliNone
("tidak dapat menentukan jumlah CPU").sumber
cpu_count
.len(os.sched_getaffinity(0))
mungkin lebih baik, tergantung tujuannya.os.cpu_count()
apa yang diminta OP) mungkin berbeda dari jumlah CPU yang tersedia untuk proses saat ini (os.sched_getaffinity(0)
).os.sched_getaffinity(0)
ini tidak tersedia di BSD, sehingga penggunaanos.cpu_count()
diperlukan (tanpa perpustakaan eksternal lainnya, yaitu).len(os.sched_getaffinity(0))
adalah apa yang biasanya Anda inginkanhttps://docs.python.org/3/library/os.html#os.sched_getaffinity
os.sched_getaffinity(0)
(ditambahkan dalam Python 3) mengembalikan set CPU yang tersedia mengingatsched_setaffinity
panggilan sistem Linux , yang membatasi CPU mana proses dan anak-anaknya dapat berjalan.0
artinya mendapatkan nilai untuk proses saat ini. Fungsi mengembalikan aset()
dari CPU yang diizinkan, sehingga perlulen()
.multiprocessing.cpu_count()
di sisi lain hanya mengembalikan jumlah total CPU fisik.Perbedaan ini sangat penting karena sistem manajemen cluster tertentu seperti Platform LSF membatasi penggunaan CPU dengan pekerjaan
sched_getaffinity
.Oleh karena itu, jika Anda menggunakan
multiprocessing.cpu_count()
, skrip Anda mungkin mencoba menggunakan lebih banyak core daripada yang tersedia, yang dapat menyebabkan kelebihan muatan dan batas waktu.Kita dapat melihat perbedaan secara konkret dengan membatasi afinitas dengan
taskset
utilitas.Sebagai contoh, jika saya membatasi Python hanya 1 core (core 0) di sistem 16 core saya:
dengan skrip uji:
main.py
maka outputnya adalah:
nproc
namun demikian menghargai afinitas secara default dan:output:
dan
man nproc
membuatnya cukup eksplisit:nproc
memiliki--all
tanda untuk kasus yang kurang umum yang ingin Anda peroleh hitungan CPU fisik:Satu-satunya downside dari metode ini adalah bahwa ini tampaknya hanya UNIX. Saya kira Windows harus memiliki API afinitas yang sama, mungkin
SetProcessAffinityMask
, jadi saya bertanya-tanya mengapa itu belum porting. Tapi saya tidak tahu apa-apa tentang Windows.Diuji dalam Ubuntu 16.04, Python 3.5.2.
sumber
Jika Anda ingin mengetahui jumlah core fisik (bukan core hyperthreaded virtual), berikut adalah solusi platform independen:
https://github.com/giampaolo/psutil/blob/master/INSTALL.rst
Perhatikan bahwa nilai default untuk
logical
adalahTrue
, jadi jika Anda ingin memasukkan core yang dapat di hiphread, Anda dapat menggunakan:Ini akan memberikan nomor yang sama dengan
os.cpu_count()
danmultiprocessing.cpu_count()
, tidak ada yang memilikilogical
argumen kata kunci.sumber
psutil.cpu_count(logical=False) #4
psutil.cpu_count(logical=True) #8
danmultiprocessing.cpu_count() #8
Ini memberi Anda jumlah CPU hyperthreaded
multiprocessing.cpu_count()
os.cpu_count()
Ini memberi Anda jumlah CPU mesin virtual
psutil.cpu_count()
numexpr.detect_number_of_cores()
Hanya masalah jika Anda bekerja pada VM.
sumber
os.cpu_count()
danmultiprocessing.cpu_count()
akan mengembalikan jumlah cpu yang di-hiphread, bukan jumlah cpu fisik yang sebenarnya.multiprocessing.cpu_count()
akan mengembalikan jumlah CPU logis, jadi jika Anda memiliki CPU quad-core dengan hyperthreading, itu akan kembali8
. Jika Anda ingin jumlah CPU fisik, gunakan binding python ke hwloc:hwloc dirancang untuk portabel di seluruh OS dan arsitektur.
sumber
psutil.cpu_count(logical=False)
Tidak dapat menemukan cara menambahkan kode atau membalas pesan, tetapi inilah dukungan untuk jython yang dapat Anda tempel sebelum menyerah:
sumber
Ini mungkin bekerja untuk kita yang menggunakan os / sistem berbeda, tetapi ingin mendapatkan yang terbaik dari semua dunia:
sumber
Anda juga dapat menggunakan "joblib" untuk tujuan ini.
Metode ini akan memberi Anda jumlah CPU dalam sistem. joblib perlu diinstal. Informasi lebih lanjut tentang joblib dapat ditemukan di sini https://pythonhosted.org/joblib/parallel.html
Atau Anda dapat menggunakan paket numexpr dari python. Ini memiliki banyak fungsi sederhana yang membantu untuk mendapatkan informasi tentang cpu sistem.
sumber
Opsi lain jika Anda tidak memiliki Python 2.6:
sumber