I have three tables that aren't particularly large (1500, 2500, and
3500 records in each). With VirtualFields enabled a select() query
take a very long time to process.
class VirtualFields(object):
def name(self):
return self.table1.table2.name
def email(self):
return self.table1.table3.email
def phone(self):
return self.table1.table3.phone
db.table1.virtualfields.append(VirtualFields())
Query: db(db.table1.id <= 1500).select()
Virtual fields enabled: 69185322 function calls (69042017 primitive
calls) in 99.450 seconds
No virtual fields: 357819 function calls (357815 primitive calls) in
0.376 seconds
cProfile output with virtual fields enabled:
Ordered by: standard name
ncalls tottime percall cumtime percall
filename:lineno(function)
1 0.001 0.001 99.450 99.450 <string>:1(<module>)
2583/1 0.022 0.000 99.449 99.449 dal.py:1004(select)
2583 0.007 0.000 1.176 0.000 dal.py:1008(response)
7749/2583 0.025 0.000 0.049 0.000 dal.py:1045(tables)
2583 0.008 0.000 1.135 0.000 dal.py:1086(log_execute)
2583 0.004 0.000 1.139 0.000 dal.py:1090(execute)
2583 0.010 0.000 0.017 0.000 dal.py:1093(represent)
2583 0.001 0.000 0.001 0.000 dal.py:
1160(represent_exceptions)
2583 0.001 0.000 0.001 0.000 dal.py:1169(rowslice)
2583/1 0.701 0.000 99.436 99.436 dal.py:1173(parse)
8397955 12.372 0.000 13.636 0.000 dal.py:3225(__getitem__)
5089122 5.700 0.000 5.700 0.000 dal.py:3234(__setitem__)
6666724 4.173 0.000 14.886 0.000 dal.py:3237(__getattr__)
7746 0.005 0.000 0.013 0.000 dal.py:3240(__setattr__)
145822 0.182 0.000 0.252 0.000 dal.py:3510(__getitem__)
2583 0.006 0.000 0.007 0.000 dal.py:3513(__setitem__)
48996 0.033 0.000 0.111 0.000 dal.py:3516(__getattr__)
2583 0.004 0.000 0.010 0.000 dal.py:3519(__setattr__)
2583 0.004 0.000 0.008 0.000 dal.py:3528(__call__)
5000043 2.280 0.000 5.662 0.000 dal.py:3631(__allocate)
5000043 5.543 0.000 13.679 0.000 dal.py:3637(__getattr__)
25820 0.029 0.000 0.040 0.000 dal.py:3643(__setattr__)
144605/19378 0.288 0.000 3.422 0.000 dal.py:
3827(__getitem__)
20658 0.016 0.000 0.077 0.000 dal.py:3895(__getattr__)
50361 0.036 0.000 0.163 0.000 dal.py:3903(__iter__)
14201 0.044 0.000 0.093 0.000 dal.py:4113(__eq__)
2583 0.008 0.000 0.017 0.000 dal.py:4116(__ne__)
1 0.000 0.000 0.000 0.000 dal.py:4122(__le__)
50361 0.037 0.000 0.037 0.000 dal.py:4488(__str__)
16785 0.018 0.000 0.018 0.000 dal.py:4509(__init__)
14202 0.012 0.000 0.012 0.000 dal.py:4565(__init__)
2583/1 0.009 0.000 99.449 99.449 dal.py:4598(select)
2583 0.003 0.000 0.003 0.000 dal.py:4663(__init__)
1291 19.583 0.015 99.071 0.077 dal.py:
4677(setvirtualfields)
2582 0.007 0.000 0.014 0.000 dal.py:4718(__getitem__)
2582 0.004 0.000 0.018 0.000 dal.py:4742(first)
2582 0.004 0.000 0.032 0.000 dal.py:761(EQ)
1 0.000 0.000 0.000 0.000 dal.py:774(LE)
55527/50361 0.054 0.000 0.123 0.000 dal.py:807(expand)
2583 0.116 0.000 0.535 0.000 dal.py:911(_select)
2583 0.015 0.000 0.015 0.000 dal.py:
998(select_limitby)
1666681 6.140 0.000 16.133 0.000 db_02_autospang.py:
181(f_nexid)
1666681 5.044 0.000 11.345 0.000 db_02_autospang.py:
185(f_proto)
1666681 5.342 0.000 13.868 0.000 db_02_autospang.py:
189(f_number)
29627 0.018 0.000 0.073 0.000 utf_8.py:15(decode)
29627 0.055 0.000 0.055 0.000 {_codecs.utf_8_decode}
61968 0.080 0.000 0.080 0.000 {built-in method match}
1666681 18.971 0.000 18.971 0.000 {dir}
6666724 1.384 0.000 1.384 0.000 {getattr}
6669306 3.894 0.000 7.651 0.000 {hasattr}
547359 0.130 0.000 0.130 0.000 {isinstance}
5165 0.001 0.000 0.001 0.000 {len}
2583 0.000 0.000 0.000 0.000 {method 'add' of 'set'
objects}
55524 0.010 0.000 0.010 0.000 {method 'append' of
'list' objects}
29627 0.035 0.000 0.109 0.000 {method 'decode' of
'str' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of
'_lsprof.Profiler' objects}
29627 0.042 0.000 0.042 0.000 {method 'encode' of
'unicode' objects}
2583 1.116 0.000 1.116 0.000 {method 'execute' of
'psycopg2._psycopg.cursor' objects}
2583 0.029 0.000 0.029 0.000 {method 'fetchall' of
'psycopg2._psycopg.cursor' objects}
13418662 3.740 0.000 3.740 0.000 {method 'get' of 'dict'
objects}
144605 0.014 0.000 0.014 0.000 {method 'isdigit' of
'str' objects}
1666681 0.527 0.000 0.527 0.000 {method 'items' of
'dict' objects}
7748 0.004 0.000 0.004 0.000 {method 'join' of 'str'
objects}
7747 0.003 0.000 0.003 0.000 {method 'keys' of 'dict'
objects}
294302 0.137 0.000 0.137 0.000 {method 'lower' of 'str'
objects}
64551 0.055 0.000 0.055 0.000 {method 'split' of 'str'
objects}
243666 0.077 0.000 0.077 0.000 {method 'startswith' of
'str' objects}
59397 0.009 0.000 0.009 0.000 {method 'strip' of 'str'
objects}
5166 0.002 0.000 0.002 0.000 {method 'union' of 'set'
objects}
1666681 1.224 0.000 1.224 0.000 {method 'update' of
'dict' objects}
Suggestions?