2016-11-27 1 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)') 

Ich versuche, ein Skript zu schreiben, das die cProfile Modul nutzt alle Funktionen aufgerufen profilieren, wenn die closest_2d Funktion mit 128.000 koordinieren zunächst auf einer Zufallsliste ausgeführt wird. Generieren Sie die zufällige Liste, und rufen Sie cProfile.run so auf, dass es closest_2d in dieser Liste ausführt; Geben Sie auch ein zweites Argument an, bei dem es sich um die Datei handelt, in die die Ergebnisse eingefügt werden sollen (und die Datei, für die pstats.Stats aufgerufen werden soll), um die Ergebnisse zu drucken.Warum erhalte ich einen TypeError, wenn ich cProfile.run() aufruft?

Ich habe folgende Fehlermeldung:

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

Wie kann ich es beheben?

+0

ich nicht. Ich verstehe wirklich nicht, warum ich diesen Fehler bekommen habe. – user6952870

+0

Hast du es zumindest googelt, bevor du hier posten kannst? – Soviut

Antwort

0

Ihr Fragetitel ist irreführend, cProfile ist wird aufgerufen, da es direkt an der Spitze Ihres Stack-Trace ist.

Das Problem ist, Sie bekommen eine TypeError weil Sie ein zwei Funktionen anstelle ihrer Rückgabewerte auf dieser Linie zu vergleichen sind versuchen:

if alist[j] <= pivot: 

Dies ist, weil Ihr nicht random.random() angerufen hat, wenn Sie haben Ihre Liste ausgefüllt, stattdessen setzen Sie random.random. Dies platziert einen Verweis auf die random-Funktion anstelle eines zufälligen Werts.

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

Sollte sein:

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

Oh, ich sehe, danke – user6952870

+0

Hey, weißt du übrigens, wie man das Ergebnis sortiert, das von der cProfile.run() produziert? wie die ncalls oder tottime? – user6952870

+0

Dies ist kein Forum; Das ist eine andere Frage. – Soviut

Verwandte Themen