2013-05-24 5 views
0

저는 100000 개가 넘는 키로 구성된 거대한 그래프를 가지고있어서 효율성이 큰 문제입니다. 나는 모든 키의 가치를 통과하고, 모든 값을, 나는 ... 예 값이 나머지 값 인 또 다른 사전에서 키가되고 싶어요 .. 여기 파이썬 사전에서 값을 선택적으로 인쇄합니다.

graph = {'foobar': ['1', '2', '3']} 
result = {'1' : ['2', '3'], '2' : ['1', '3'], '3' : ['1', '2']} #in no particular order 

가에서 내 코드입니다 그 순간 ...

for i in heroDict.values(): 
    for j in i: 
     if graph.has_key(j): 
      tempDict = copy.deepcopy(i) 
      tempDict.remove(j) 
      heroList = tempDict 
      graph[j] += heroList 
     else: 
      tempDict = copy.deepcopy(i) 
      tempDict.remove(j) 
      heroList = tempDict 
      graph[j] = heroList 
return graph 

'heroDict'는 매우 큰 것을 제외하고는 예제와 비슷한 사전입니다.

문제는 내가 수행하고있는 deepcopy() 때문에 코드가 매우 느리게 실행되고 있다는 것입니다. 예를 들어 foobar 예제에서는 키로 '1'을 얻습니다. 나는 '[1],'2 ','3 ']을 일시적인 dict에 복사하므로 변경된 내용은 내가 반환 한 최종 사전에 영향을 미치지 않습니다. 그런 다음 [1, 2, 3]에서 키를 제거하고 '1'키를 할당합니다. 그래서 저는 {1 ': ['2 ','3 ']}로 남았습니다. 그것은 제가 원했던 것이지만 100000 번 반복하기 때문에 너무 오래 걸립니다.

내 마지막 질문은 어떤 방식 으로든이를 개선하여 더 빨리 실행할 수 있습니까?

도움을 주시면 대단히 감사하겠습니다.

+1

얼마나 많은 RAM이 있습니까? 제가 이해한다면 99999 가지 요소의 100000 목록을보고 있습니다. 10Giga 객체는 많은 RAM을 필요로합니다. –

+0

두 번째'dict'을 메모리에 실제로 만들 필요가 있습니까? 필요시 값을 계산하는 것이 더 쉽고 효율적이지는 않은 것 같습니다. 당신은 그것을 무엇을 위해 사용합니까? –

+0

두 번째 dict 작성은 필자가 구현 한 방법 일뿐입니다. 천천히 만드는거야. 나는 지금 얻고있는 동일한 결과를 얻는 또 다른 방법을 생각할 수는 없지만 더 빨리. – Ogen

답변

4

순열은 itertools에 포함됩니다.

귀하의 예제에서 일반적인 사용은 다음과 같습니다는 foobar의 값의 수와

>>> from itertools import permutations 
>>> values = graph['foobar'] 
>>> result = {x[0]:x[1:] for x in permutations(values)} 
>>> print result 
{'1': ('3', '2'), '2': ('3', '1'), '3': ('2', '1')} 

작품. 순열은 생성기이므로 한 번에 전체 사전을 생성하는 대신 한 번에 하나의 항목 만 호출 할 수 있습니다.

얼마나 빠를 지 잘 모릅니다.

+0

나는 지금 그것을 시도하고 다시 당신에게 대답을 주셔서 감사합니다 – Ogen

+0

고마워, 그게 효과가! – Ogen

관련 문제