Это больше похоже на проблему pivot
, поэтому я использую pivot_table
здесь
s=df.pivot_table(index=['PatientID','FName','LName','PName','PPhone'],columns='Ear',values=['Model#','SerNum'],aggfunc='first')
s.columns=s.columns.map(' '.join)
s.reset_index(inplace=True)
s
PatientID FName LName ... Model# Right SerNum Left SerNum Right
0 P99999 John Doe ... 400 1234567 2345678
[1 rows x 9 columns]
Планирование в Windows при гранулярности потока. Основная идея позади этого подхода состоит в том, что процессы не выполняют, но только обеспечивают ресурсы и контекст в который их выполненные потоки. Возвращаясь к Вашему вопросу, потому что решения планирования приняты строго на основе потока, никакое внимание не уделено, к какому процессу поток принадлежит. В Вашем примере, если процесс A имеет 1 выполнимый поток и процесс, B имеет 50 выполнимых потоков, и весь 51 поток в том же приоритете, каждый поток получил бы 1/51 процессорного времени — Windows не даст 50 процентов ЦП для обработки A и 50 процентов для обработки B. Для понимания алгоритмов планирования потоков необходимо сначала понять приоритетные уровни тот Windows использование. Можно относиться здесь за справочником.
Попытайтесь читать Windows Internals для того, чтобы подробно понять.
Единица планирования является потоком, не процессом, таким образом, процесс с 50 потоками, всеми в жестком цикле, получит намного больше CPU, чем процесс только с единственным потоком, если все работают в том же приоритете. Это обычно - не беспокойство, так как большинство потоков в системе не находится в выполнимом состоянии и не будет подлежать планированию; они ожидают на вводе-выводе, ожидая входа от пользователя, и так далее.
Windows Internals является замечательной книгой для получения дополнительной информации о планировщике потока Windows.
Все вышеупомянутое точно, но если Вы волнуетесь по поводу 50 процессов потока hogging весь ЦП, СУЩЕСТВУЮТ методы, которые можно сделать, чтобы гарантировать, что никакой единственный процесс не сокрушает ЦП.
По моему скромному мнению, лучший способ сделать это должно использовать объекты задания справиться с использованием процесса. Сначала назовите CreateJobObject, затем SetInformationJobObject для ограничения макс. использования ЦП процессов в объекте задания и AssignProcessToJobObject для присвоения процесса с 50 потоками к объекту задания. Можно затем позволить ОС гарантировать, что 50 процессов потока не используют слишком много процессорного времени.
Это зависит от поведения потоков. В целом с 50: 1 различие в количестве потока, да, приложение с большим количеством потоков собирается получить намного больше времени. Однако окна также используют динамическое установление приоритетов потока, которое может изменить это несколько. Динамическое установление приоритетов потока описано здесь:
http://support.microsoft.com/kb/109228
Соответствующая выборка:
Базовый приоритет потока является основным уровнем, от которого внесены эти восходящие корректировки. Текущий приоритет потока называют его динамическим приоритетом. Интерактивные потоки, которые уступают перед их интервалом времени, возросли, будет иметь тенденцию быть скорректированным вверх в приоритете от их базового приоритета. Вычислите ограниченные потоки, которые не уступают, используя их весь интервал времени, будет иметь тенденцию уменьшать их приоритет, но не ниже основного уровня. Это расположение часто называют эвристическим планированием. Это обеспечивает лучшую интерактивную производительность и имеет тенденцию уменьшать системное влияние "потоков" пожирателя ресурсов ЦП.