Как сделать временную метку атомарной / безопасной прерывания в Python? - PullRequest
2 голосов
/ 11 февраля 2020

Это должно быть легко. Посмотрев, что происходит, я не уверен. Является ли запись / чтение одного двоичного целого атома c? Вот как базовое оборудование выполняет чтение и запись 32-разрядных целых чисел. После некоторых исследований я понял, что Python не хранит целые числа как набор байтов. Он даже не хранит байты как набор байтов. Там есть накладные расходы. Разве эти издержки нарушают характер atomi c двоичных чисел?

Вот код, который я использовал, пытаясь выяснить это:

import time
import sys

tm=time.time()
int_tm = int(tm * 1000000)
bin_tm = bin(int_tm)
int_bin_tm = int(bin_tm, 2)

print('tm:', tm, ", Size:", sys.getsizeof(tm))
print('int_tm:', int_tm, ", Size:", sys.getsizeof(int_tm))
print('bin_tm:', bin_tm, ", Size:", sys.getsizeof(bin_tm))
print('int_bin_tm:', int_bin_tm, ", Size:", sys.getsizeof(int_bin_tm))

Вывод:

tm: 1581435513.076924 , Size: 24
int_tm: 1581435513076924 , Size: 32
bin_tm: 0b101100111100100111010100101111111011111110010111100 , Size: 102
int_bin_tm: 1581435513076924 , Size: 32

Для пары побочных вопросов, действительно ли двоичное представление целых чисел Python потребляет намного больше памяти? Я использую неправильный тип для преобразования десятичных целых чисел в байты?

1 Ответ

3 голосов
/ 11 февраля 2020

Python не гарантирует никаких операций атома c, кроме указанных c конструкций мьютекса, таких как блокировки и семафоров . Некоторые операции будут кажется, что это atomi c, потому что GIL предотвратит запуск байт-кода одновременно на нескольких python потоках "Эта блокировка необходима главным образом потому, что управление памятью CPython не является потоком -безопасно".

В основном это означает, что python обеспечит полную оценку всей инструкции байт-кода, прежде чем разрешить другому потоку продолжить. Это не означает, однако, что вся строка кода гарантированно завершается без перерыва. Это особенно верно для вызовов функций. Чтобы глубже взглянуть на это, взгляните на модуль dis.

Я также укажу, что этот разговор об атомарности ничего не значит на аппаратном уровне, сама идея интерпретируемый язык должен абстрагироваться от аппаратного обеспечения. Если вы хотите учесть «фактическую» атомарность оборудования, обычно это будет функция, предоставляемая операционной системой (именно так python, вероятно, реализует такие вещи, как threading.Lock).

Обратите внимание на размеры данных (это просто быстрый ie, потому что это совсем другой вопрос):

sizeof(tm): 8 байт для 64-разрядного числа с плавающей запятой, 8 байт для указатель на тип данных и 8 байтов для указателя на счетчик ссылок

sizeof(int_tm): целые числа немного сложнее, так как некоторые маленькие значения «кэшируются» с использованием меньшего формата для эффективности, чем большого значения используют более гибкий тип, в котором число байтов, используемых для хранения целого числа, может быть увеличено до сколь угодно большого значения.

sizeof(bin_tm): Это на самом деле строка, поэтому она занимает гораздо больше памяти, чем просто число, есть довольно значительные издержки, плюс как минимум один байт на символ.

«Использую ли я неправильный тип для преобразования ..?» Нам нужно знать, что вы пытаетесь сделать с результатом, чтобы ответить на этот вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...