2012-02-28 2 views
1

У меня есть цикл, где в каждой итерации я (ре) вычислить длинный вектор значений:KeyboardInterrupt - это безопасно для скопированных данных

try: 
    while(1): 
     long_vec = recalculate(long_vec) 
     last_vec = long_vec.copy() 
except KeyboardInterrupt: 
    print last_vec 

long_vec и last_vec являются Numpy массивов.

Мой вопрос: могу ли я быть уверенным, что когда я нажимаю CTRL + C, он не будет нарушать функцию copy(), а last_vec не будет нарушен?

+0

Ctrl + C может сломаться только код Python. Так что это зависит от того, реализована ли 'long_vec.copy()' в Python или C. Вам придется искать исходный код NumPy - или ждать, пока кто-то сделает это за вас. :) –

+0

@SvenMarnach: :) Я верю, что это на C, но пусть рассмотрит худший общий случай, что все в Python –

ответ

5

Это не .copy(), что имеет значение, это последующее присвоение ссылки (last_vec =).

Я считаю, что присваивание является атомарным в CPython (т. Е. Для него требуется одна инструкция по байт-коду).

Другими словами, last_vec может либо содержать значение из предыдущей итерации, либо скопированное значение из текущей итерации. Нажатие Ctrl-C не может привести к last_vec, содержащему частичную копию нового значения.

+0

Вы правы, атомарность задания - это то, что имеет значение. (И он является атомарным, байт-код является инструкцией 'STORE_NAME'.) –

0

Вы можете убедиться, что он будет скопирован с помощью finally блока:

while True: 
    try: 
     long_vec = recalculate(long_vec) 
    except KeyboardInterrupt: 
     print long_veC# last_vec == long_vec in your example 
    finally: 
     # does not make sense, since the program halts after that: 
     last_vec = long_vec.copy() 
Смежные вопросы