2016-11-27 11 views
0
import math    
import random    
import cProfile 
import pstats      
from goody import irange 


def partition(alist, left, right): 
    def swap(i,j): alist[i],alist[j] = alist[j],alist[i] 
    pivot = alist[right] 
    i = left 
    for j in range(left,right): 
     if alist[j] <= pivot: 
      swap(i,j)   
      i += 1 
    swap(i,right)   
    return I 

def select(alist, n): 
    left,right = 0, len(alist)-1 
    while True: 
     if left == right: 
      return alist[left] 
     pivot_index = partition(alist, left, right) 
     if n == pivot_index: 
      return alist[n] 
     elif n < pivot_index: 
      right = pivot_index - 1 
     else: 
      left = pivot_index + 1 

def closest_2d(alist): 
    def dist(p1,p2): return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2) 
    def min_none(*args): return min([x for x in args if x != None]) 
    if len(alist) < 2: 
     return None # +infinity 
    if len(alist) == 2: 
     return dist(alist[0],alist[1]) 

    m = select([x for (x,_) in alist],len(alist)//2) 
    s1,s2,s3 = [],[],[] 
    for v in alist: 
     if v[0] == m: 
      s3.append(v) 
     else: 
      (s1 if v[0] < m else s2).append(v) 
    if s1 == []: 
     s1.append(s3[0]) 
     s2.extend(s3[1:]) 
    else: 
     s2.append(s3[0]) 
     s1.extend(s3[1:]) 


    d1 = closest_2d(s1) 
    d2 = closest_2d(s2) 
    d = min_none(d1,d2) 

    s1.sort(key = lambda p : p[1]) 
    s2.sort(key = lambda p : p[1]) 
    i,j = 0,0 
    d3 = None # +infinity 
    while True: 
     while i != len(s1) and j != len(s2) and abs(s1[i][1]-s2[j][1]) > d: 
      if s1[i][1] < s2[j][1]: 
       i += 1 
      else: 
       j += 1 

     if i == len(s1) or j ==len(s2): 
      break; 

     j1 = j 
     while j1 < len(s2) and abs(s1[i][1]-s2[j1][1]) < d: 
      if d3 == None or dist(s1[i],s2[j1]) < d3: 
       d3 = dist(s1[i],s2[j1]) 
      j1 += 1 

     i += 1    
    return min_none(d1,d2,d3) 

# My code 

a = [] 
for i in range(128000): 
    a.append((random.random,random.random)) 

cProfile.run('closest_2d(a)') 

나는 12833 좌표의 랜덤 목록에서 closest_2d 함수가 처음 실행될 때 호출되는 모든 함수를 프로파일 링하기 위해 cProfile 모듈을 사용하는 스크립트를 작성하려고합니다. 무작위 목록을 생성 한 다음 cProfile.run을 호출하여 해당 목록에서 closest_2d을 실행합니다. 또한 결과를 인쇄 할 파일 (및 pstats.Stats을 호출 할 파일)을 결과로 인쇄하는 두 번째 인수를 지정하십시오.cProfile.run()을 호출 할 때 왜 TypeError가 발생합니까?

내가 그것을 어떻게

Traceback (most recent call last): 
    cProfile.run('closest_2d(a)') 
    return _pyprofile._Utils(Profile).run(statement, filename, sort) 
    prof.run(statement) 
    return self.runctx(cmd, dict, dict) 
    exec(cmd, globals, locals) 
    m = select([x for (x,_) in alist],len(alist)//2) 
    pivot_index = partition(alist, left, right) 
    if alist[j] <= pivot: 
    TypeError: unorderable types: builtin_function_or_method() <= builtin_function_or_method() 
을 를 해결할 수 :

나는 다음과 같은 오류가있어?

+0

나는하지 않았다. 나는 왜 내가이 오류가 있는지 이해하지 못한다. – user6952870

+0

여기에 글을 게시하기 전에 Google을 먼저 사용해 보셨습니까? – Soviut

답변

0

질문 모음 제목이 잘못되었습니다. cprofile 은 스택 추적의 맨 위에 있으므로이 호출되었습니다.

if alist[j] <= pivot: 

이것은 당신 때문에 random.random() 때 전화하지 않았다됩니다 :이 라인 대신 자신의 반환 값의 두 가지 기능을 비교하기 위해 노력하고 있기 때문에

문제는, 당신은 TypeError을 받고있어 당신은 당신의 목록을 채우고 있었는데, 대신에 random.random을 넣었습니다. 그러면 무작위 값이 아닌 random 함수에 대한 참조가 배치됩니다.

a.append((random.random,random.random)) 

은 다음과 같아야합니다

a.append((random.random(), random.random())) 
+0

아, 고맙습니다. – user6952870

+0

안녕하세요, cProfile.run()에 의해 생성 된 결과를 정렬하는 방법을 알고 계십니까? ncalls 또는 tottime과 같은 – user6952870

+0

이것은 포럼이 아닙니다. 그것은 다른 질문입니다. – Soviut