text: from __future__ import print_function
  
  import sys
  import os.path as osp
  import timeit
  import numpy as np
  
  sys.path.insert(0, osp.dirname(osp.abspath(__file__)) + '/../../..')
  from torchreid import metrics
  
  """
  Test the speed of cython-based evaluation code. The speed improvements
  can be much bigger when using the real reid data, which contains a larger
  amount of query and gallery images.
  
  Note: you might encounter the following error:
    'AssertionError: Error: all query identities do not appear in gallery'.
  This is normal because the inputs are random numbers. Just try again.
  """
  
  print('*** Compare running time ***')
  
  setup = '''
  import sys
  import os.path as osp
  import numpy as np
  sys.path.insert(0, osp.dirname(osp.abspath(__file__)) + '/../../..')
  from torchreid import metrics
  num_q = 30
  num_g = 300
  max_rank = 5
  distmat = np.random.rand(num_q, num_g) * 20
  q_pids = np.random.randint(0, num_q, size=num_q)
  g_pids = np.random.randint(0, num_g, size=num_g)
  q_camids = np.random.randint(0, 5, size=num_q)
  g_camids = np.random.randint(0, 5, size=num_g)
  '''
  
  print('=> Using market1501\'s metric')
  pytime = timeit.timeit('metrics.evaluate_rank(distmat, q_pids, g_pids, q_camids, g_camids, max_rank, use_cython=False)', setup=setup, number=20)
  cytime = timeit.timeit('metrics.evaluate_rank(distmat, q_pids, g_pids, q_camids, g_camids, max_rank, use_cython=True)', setup=setup, number=20)
  print('Python time: {} s'.format(pytime))
  print('Cython time: {} s'.format(cytime))
  print('Cython is {} times faster than python\n'.format(pytime / cytime))
  
  print('=> Using cuhk03\'s metric')
  pytime = timeit.timeit('metrics.evaluate_rank(distmat, q_pids, g_pids, q_camids, g_camids, max_rank, use_metric_cuhk03=True, use_cython=False)', setup=setup, number=20)
  cytime = timeit.timeit('metrics.evaluate_rank(distmat, q_pids, g_pids, q_camids, g_camids, max_rank, use_metric_cuhk03=True, use_cython=True)', setup=setup, number=20)
  print('Python time: {} s'.format(pytime))
  print('Cython time: {} s'.format(cytime))
  print('Cython is {} times faster than python\n'.format(pytime / cytime))
  
  """
  print("=> Check precision")
  
  num_q = 30
  num_g = 300
  max_rank = 5
  distmat = np.random.rand(num_q, num_g) * 20
  q_pids = np.random.randint(0, num_q, size=num_q)
  g_pids = np.random.randint(0, num_g, size=num_g)
  q_camids = np.random.randint(0, 5, size=num_q)
  g_camids = np.random.randint(0, 5, size=num_g)
  
  cmc, mAP = evaluate(distmat, q_pids, g_pids, q_camids, g_camids, max_rank, use_cython=False)
  print("Python:\nmAP = {} \ncmc = {}\n".format(mAP, cmc))
  cmc, mAP = evaluate(distmat, q_pids, g_pids, q_camids, g_camids, max_rank, use_cython=True)
  print("Cython:\nmAP = {} \ncmc = {}\n".format(mAP, cmc))
  """