2017-10-28 2 views
2

숫자 목록이 있습니다 (기본 예) [50,100,150,200,250] 지정된 인덱스에서 각 숫자를 지정된 양만큼 증가 (또는 감소)해야합니다. 나는 두 가지 방법으로이 작업을 수행 할 수 있었다 :특정 포인트에서 목록의 파이썬 증분 숫자

from itertools import islice 

l = [50,100,150,200,250] 
start_increment_index = 3 

l[start_increment_index:] = [e+100 for e in l[start_increment_index:]] 
print (l) 

l = [50,100,150,200,250] 

l[start_increment_index:] = [e+100 for e in islice(l,start_increment_index,len(l))] 
print (l) 

모두 인쇄 : [50, 100, 150, 300, 350]

그러나, 내 진짜 목록 숫자의 수백만을 포함하고이 작업이 다른 인덱스와 다른 증가/감소합니다 반복적으로 수행한다. 파이썬리스트를 사용하여 이것을하는 더 빠른 방법이 있을까요? 나는이 문제를 다루기 위해 내 자신의 C/C++ 확장을 작성하려고 애썼다.

편집 : 이것은 일반적으로 파이썬에 유용한 모듈일까요? 매개 변수를 취할 수있는 C로 작성된 함수를 갖는 (python_list_object, increment_amount, start_index, end_index)?

+1

Python 질문을하는 경우 관련이없는 언어 태그 (예 : C 또는 C++)를 추가하지 마십시오. C 또는 C++ 모듈을 작성한 다음 * 관련 * 태그를 사용하여 관련 질문을 할 수 있습니다. –

+0

Python의 배열 구조를 확인하십시오. 숫자 값의 효율적인 배열입니다. – Vinny

+1

최상의 성능이 필요한 경우 C/C++ 프로그램을 작성해야합니다 (알고리즘은 작성이 간단하고 스레드 최적화가 가능할 수도 있음). 그렇지 않으면이 목표를 달성하려면이 스크립트를 계속 사용하고 응답을 기다리십시오. 일반적으로 말하자면 숫자 (수백만 또는 수조와 같은)의 크기가 얼마나 큰지 그리고이 스크립트/프로그램을 얼마나 자주 사용한다고 생각하는지에 달려 있습니다. –

답변

1

구체적으로 목표에 따라 다릅니다. 이 경우 세그먼트 트리를 사용할 수 있다고 가정합니다. 자세한 내용은 https://en.m.wikipedia.org/wiki/Segment_tree을 참조하십시오.

간단한 설명을 위해. 이 구조체는 범위 연산 (숫자가있는 더하기/빼기 부분 배열과 같은)이 수행 될 배열을 나타냅니다.이 구조는 매우 많은 수의 범위 쿼리가있는 경우에 최적화되어 있습니다.

참고 : 당신은 파이썬리스트 구조를 사용하려는 경우, 당신은 스파 스 테이블을 구현할 수 있습니다 (이 배열에서 나무의 암시 저장과 세그먼트 트리의 또 다른보기이다)

1
솔루션에

큰 문제는 당신이 만듭니다 (메모리 할당 + 복사) 두 목록. 처음에는 자체적으로 목록 이해력이 있고 그 안에 두 번째 l[start_increment_index:]입니다.

for i in range(start_increment_index, len(l)): 
    l[i] += increment 

NB를 : 당신이 데이터 소스가 파이썬 목록 인 경우

, 당신은 당신이 O (n)에 대한 작업을 수행 할 수 increment 먼저 정의합니다.