当我调用cProfile.run()时为什么会出现TypeError?

时间:2016-11-27 08:48:04

标签: python cprofile

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

我正在尝试编写一个脚本,该脚本使用cProfile模块来分析在{128}坐标随机列表上首先运行closest_2d函数时调用的所有函数。生成随机列表,然后调用cProfile.run以使其在该列表上运行closest_2d;还指定了第二个参数,即放置结果的文件(以及要调用pstats.Stats的文件)以打印结果。

我收到以下错误:

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

我该如何解决?

1 个答案:

答案 0 :(得分:0)

您的问题标题具有误导性,cXrofile 正在被调用,因为它位于堆栈跟踪的顶部。

问题是,你得到的是android:layout_below="@+id/phone_layout",因为你试图在这一行上比较两个函数而不是它们的返回值:

TypeError

这是因为您在填充列表时没有致电if alist[j] <= pivot: ,而是放了random.random()。这会引用random.random函数而不是随机值。

random

应该是:

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