2016-06-29 2 views
2

파이썬에서 카운터 itertools.count (2.7.9)은 스레드 안전 계산에 매우 편리합니다. 카운터의 현재 값을 어떻게 얻을 수 있습니까?파이썬 itertools 카운터의 현재 값은 무엇입니까

import itertools 
x = itertools.count() 
print x.next() # 0 
print x.next() # 1 
print x.next() # 2 

지금까지 너무 좋은 :

카운터가 증가하고 마지막 값이 next()를 호출 할 때마다 반환합니다.

next()을 호출하지 않고 카운터의 현재 값을 가져 오는 방법을 찾을 수 없습니다. 카운터를 높이거나 repr() 함수를 사용하면 부작용이 생길 수 있습니다.

위에 이어 :

print repr(x) # "count(3)" 

그래서 당신이 repr()의 출력을 구문 분석 할 수있다. 뭔가 같은

current_value = int(repr(x)[6:-1]) 

트릭을 할 것이지만, 정말 못 생겼어.

카운터의 현재 값을보다 직접 가져 오는 방법이 있습니까?

+0

특히 스레드 안전하다고는 어디입니까? –

+0

@MattiVirkkunen 나는 [this answer] (http://stackoverflow.com/a/27062830/2291710)을 읽고 나 자신을 테스트 한 후,'next (count()) '가 실제로 스레드로부터 안전하다는 것을 알 수있다. – Delgan

+1

스레드 안전성 테스트는 쉽지 않습니다. 또한 GIL을 사용하여 thread를 안전하게 유지하려면 plain 변수와'+ ='를 사용하는 것과 실제로 다른 점이 있습니까? –

답변

2

출처 Luke!

module implementation에 따르면 불가능합니다.

typedef struct { 
    PyObject_HEAD 
    Py_ssize_t cnt; 
    PyObject *long_cnt; 
    PyObject *long_step; 
} countobject; 

현재 상태는 cntlong_cnt 회원에 저장되고, 그 중 어느 것도 객체 API에 노출되어있다. 당신이 제안한 것처럼 객체가 검색 될 수있는 곳은 객체 __repr__입니다.

문자열을 구문 분석하는 동안 비 특이 증가 사례를 고려해야합니다. repr(itertools.count(123, 4))'count(123, 4)'과 같습니다.이 경우 귀하가 제안한 논리는 실패합니다.

+0

멋지게 정리해 주셔서 감사합니다. 이제 나는 그것이 불가능하다는 이유를 최소한 이해한다 :-) – Carl

0

documentation에 따르면 함수의 현재 값에 액세스 할 수있는 방법이 없습니다. itertools.count()itertools 모듈의 생성자 메소드입니다. 따라서 단순히 에 변수에 대한 생성자의 현재 값의 값을 할당하는 것이 일반적입니다. ,

current_value = x.next() 

또는 당신은 래퍼 함수를 ​​만들 수

current_value = next(x) 

(내장 파이썬 방법 파이썬 버전 ≥ 2.6에 대한 ) :

은 간단히 다음 호출의 결과를 저장 추가 된 구문 설탕을 원한다면 유틸리티 데코레이터 클래스가 필요하지만 할당이 표준입니다.

0

It은 발전기이므로 원하는 것을하기가 쉽지 않습니다.

여러 위치에서 값을 사용하려면 .next()을 통해 값을 가져 와서 변수에 저장하는 것이 좋습니다. 카운터가이 두 가지 사용 사이에서 증가 될 수 있다고 염려되는 경우, 어쨌든 critical section에 카운터를 둘 필요가 있습니다.

해당 수표에 의해 생성 된 추가 '+1로 해당 카운터를 오염시키지 않으려면 추가 카운터 하나를 사용하여 수표를 계산할 수 있습니다 (중요 섹션에도이 카운터를 넣으십시오). 전자에서 후자를 Substracting하면 필요한 것을 얻을 수 있습니다.

또한 스레드 안전성에 대해 정말로 알고 있습니까? 문서 페이지에는 스레드에 관한 정보가 없습니다.