2012-02-28 3 views
1

나는 각 반복에서 I (재) 값의 긴 벡터를 계산 루프가 안전합니다.KeyboardInterrupt는 복사 된 데이터

질문 : CTRL + C를 누르면 copy() 함수가 중단되지 않고 last_vec이 손상되지 않았는지 확인할 수 있습니까?

+0

Ctrl + C는 파이썬 코드를 깰 수 있습니다. 그래서 이것은'long_vec.copy()'가 파이썬이나 C로 구현되었는지 여부에 달려 있습니다. NumPy의 소스 코드를 보거나 다른 사람이 당신을 대신해서 기다려야합니다. :) –

+0

@SvenMarnach : :) 저는 C 언어로 믿습니다. 그러나 모든 것이 파이썬으로되어있는 최악의 일반적인 경우를 생각해 봅시다. –

답변

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()