Performance in Python

Simple performance in Python can be measured by the profile module using a command like,

$ python3 -m profile <script.py> {{args to script.py}}

Measuring performance of a simple iteration of Tamil spell checker shows,

python3 -m profile demo.py 
u'இன்பம்',
u'ஆப்பம்',
u'இன்னம்',
u'இன்பன்',
u'அற்பம்',
u'அப்பம்',
u'அற்றம்',
u'அற்கம்',
u'அக்கம்',
u'அட்டம்',
u'அம்மம்',
u'அற்பர்',
u'அப்பன்',
u'அப்பர்',
u'அப்பல்',
u'அம்பர்',
u'அம்பல்',
u'அன்னம்',
u'அன்னன்',
u'அன்னல்',
u'அன்பன்',
L = 21
         3192524 function calls (2736876 primitive calls) in 32.678 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       39    0.002    0.000    0.022    0.001 :0(__build_class__)
        2    0.000    0.000    0.000    0.000 :0(__contains__)
     17/4    0.000    0.000    0.144    0.036 :0(__import__)
        2    0.000    0.000    0.000    0.000 :0(__new__)
       35    0.000    0.000    0.000    0.000 :0(_fix_co_filename)
        1    0.000    0.000    0.000    0.000 :0(_getframe)
      253    0.001    0.000    0.001    0.000 :0(acquire_lock)
        1    0.000    0.000    0.000    0.000 :0(add)
       94    0.000    0.000    0.000    0.000 :0(allocate_lock)
       44    0.001    0.000    0.002    0.000 :0(any)
   519988    2.090    0.000    2.090    0.000 :0(append)
       11    0.000    0.000    0.000    0.000 :0(bit_length)
        1    0.000    0.000    0.000    0.000 :0(callable)
        4    0.000    0.000    0.000    0.000 :0(cast)
   197036    0.815    0.000    0.815    0.000 :0(chr)
        1    0.000    0.000    0.000    0.000 :0(close)
        1    0.000    0.000    0.000    0.000 :0(cmp_to_key)
        3    0.000    0.000    0.000    0.000 :0(compile)
        1    0.000    0.000    0.000    0.000 :0(create_builtin)
        8    0.005    0.001    0.005    0.001 :0(create_dynamic)
        1    0.000    0.000    0.000    0.000 :0(dir)
       51    0.000    0.000    0.000    0.000 :0(endswith)
     37/1    0.001    0.000   32.675   32.675 :0(exec)
        1    0.000    0.000    0.000    0.000 :0(exec_builtin)
        8    0.000    0.000    0.000    0.000 :0(exec_dynamic)
        1    0.000    0.000    0.000    0.000 :0(exp)
       32    0.000    0.000    0.001    0.000 :0(extend)
       32    0.000    0.000    0.000    0.000 :0(find)
       17    0.000    0.000    0.000    0.000 :0(format)
       70    0.000    0.000    0.000    0.000 :0(from_bytes)
      117    0.001    0.000    0.001    0.000 :0(fspath)
   412207    1.985    0.000    1.985    0.000 :0(get)
      146    0.001    0.000    0.001    0.000 :0(get_ident)
      274    0.001    0.000    0.001    0.000 :0(getattr)
       36    0.001    0.000    0.001    0.000 :0(getcwd)
      168    0.001    0.000    0.001    0.000 :0(getlower)
       14    0.000    0.000    0.000    0.000 :0(globals)
      270    0.001    0.000    0.001    0.000 :0(hasattr)
        1    0.000    0.000    0.000    0.000 :0(index)
       20    0.000    0.000    0.000    0.000 :0(is_builtin)
       44    0.000    0.000    0.000    0.000 :0(is_frozen)
        6    0.000    0.000    0.000    0.000 :0(isidentifier)
      296    0.001    0.000    0.001    0.000 :0(isinstance)
        8    0.000    0.000    0.000    0.000 :0(items)
    64438    0.311    0.000    0.311    0.000 :0(join)
   172718    0.760    0.000    0.760    0.000 :0(keys)
129971/129966    0.664    0.000    0.664    0.000 :0(len)
        5    0.001    0.000    0.001    0.000 :0(listdir)
       35    0.010    0.000    0.010    0.000 :0(loads)
        2    0.000    0.000    0.000    0.000 :0(log)
        1    0.000    0.000    0.000    0.000 :0(lookup)
      101    0.000    0.000    0.000    0.000 :0(lower)
      102    0.000    0.000    0.000    0.000 :0(match)
        4    0.000    0.000    0.000    0.000 :0(max)
       39    0.000    0.000    0.000    0.000 :0(min)
        1    0.000    0.000    0.000    0.000 :0(open)
        1    0.000    0.000    0.000    0.000 :0(openssl_md5)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha1)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha224)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha256)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha384)
        1    0.000    0.000    0.000    0.000 :0(openssl_sha512)
    99429    0.397    0.000    0.397    0.000 :0(ord)
   172717    0.753    0.000    0.753    0.000 :0(pop)
       22    0.001    0.000    0.001    0.000 :0(print)
       37    0.002    0.000    0.002    0.000 :0(read)
      253    0.001    0.000    0.001    0.000 :0(release_lock)
        1    0.000    0.000    0.000    0.000 :0(replace)
        1    0.000    0.000    0.000    0.000 :0(repr)
        1    0.000    0.000    0.000    0.000 :0(rfind)
      354    0.002    0.000    0.002    0.000 :0(rpartition)
      977    0.004    0.000    0.004    0.000 :0(rstrip)
        1    0.000    0.000    0.000    0.000 :0(seed)
       25    0.000    0.000    0.000    0.000 :0(setattr)
        2    0.000    0.000    0.000    0.000 :0(setdefault)
        1    0.003    0.003    0.003    0.003 :0(setprofile)
        2    0.000    0.000    0.000    0.000 :0(sort)
   172718    1.104    0.000    1.104    0.000 :0(sorted)
        9    0.000    0.000    0.000    0.000 :0(split)
        1    0.013    0.013    0.013    0.013 :0(splitlines)
        1    0.000    0.000    0.000    0.000 :0(sqrt)
       14    0.000    0.000    0.000    0.000 :0(startswith)
      187    0.004    0.000    0.004    0.000 :0(stat)
    63896    0.314    0.000    0.314    0.000 :0(strip)
        4    0.000    0.000    0.000    0.000 :0(tolist)
        5    0.000    0.000    0.000    0.000 :0(translate)
        1    0.000    0.000    0.000    0.000 :0(union)
        4    0.000    0.000    0.000    0.000 :0(update)
        1    0.006    0.006    0.006    0.006 :0(utf_8_decode)
       73    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:103(release)
       48    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:143(__init__)
       48    0.001    0.000    0.004    0.000 <frozen importlib._bootstrap>:147(__enter__)
       48    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:151(__exit__)
       73    0.001    0.000    0.003    0.000 <frozen importlib._bootstrap>:157(_get_module_lock)
       47    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:176(cb)
       25    0.000    0.000    0.002    0.000 <frozen importlib._bootstrap>:194(_lock_unlock_module)
     70/4    0.001    0.000    0.149    0.037 <frozen importlib._bootstrap>:211(_call_with_frames_removed)
      488    0.002    0.000    0.002    0.000 <frozen importlib._bootstrap>:222(_verbose_message)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:232(_requires_builtin_wrapper)
       44    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:307(__init__)
       44    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:311(__enter__)
       44    0.001    0.000    0.002    0.000 <frozen importlib._bootstrap>:318(__exit__)
      176    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:321(<genexpr>)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:35(_new_module)
       45    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:369(__init__)
       78    0.001    0.000    0.006    0.000 <frozen importlib._bootstrap>:403(cached)
       72    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:416(parent)
       44    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:424(has_location)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:433(spec_from_loader)
       44    0.002    0.000    0.010    0.000 <frozen importlib._bootstrap>:504(_init_module_attrs)
       44    0.001    0.000    0.018    0.000 <frozen importlib._bootstrap>:564(module_from_spec)
       47    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:58(__init__)
     44/4    0.002    0.000    0.151    0.038 <frozen importlib._bootstrap>:651(_load_unlocked)
       45    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:707(find_spec)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:728(create_module)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:736(exec_module)
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:753(is_package)
       73    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:78(acquire)
       44    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:780(find_spec)
      133    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:843(__enter__)
      133    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap>:847(__exit__)
       45    0.002    0.000    0.044    0.001 <frozen importlib._bootstrap>:870(_find_spec)
     48/3    0.001    0.000    0.156    0.052 <frozen importlib._bootstrap>:936(_find_and_load_unlocked)
     48/3    0.002    0.000    0.156    0.052 <frozen importlib._bootstrap>:966(_find_and_load)
    72/24    0.001    0.000    0.139    0.006 <frozen importlib._bootstrap>:997(_handle_fromlist)
        5    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1067(_path_hooks)
      106    0.001    0.000    0.003    0.000 <frozen importlib._bootstrap_external>:1080(_path_importer_cache)
       44    0.002    0.000    0.037    0.001 <frozen importlib._bootstrap_external>:1117(_get_spec)
       44    0.000    0.000    0.038    0.001 <frozen importlib._bootstrap_external>:1149(find_spec)
        5    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1196(__init__)
       40    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1202(<genexpr>)
       43    0.001    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:1228(_get_spec)
       89    0.007    0.000    0.031    0.000 <frozen importlib._bootstrap_external>:1233(find_spec)
        5    0.000    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:1281(_fill_cache)
        5    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1310(<setcomp>)
        5    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1322(path_hook_for_FileFinder)
       70    0.003    0.000    0.009    0.000 <frozen importlib._bootstrap_external>:263(cache_from_source)
       43    0.001    0.000    0.006    0.000 <frozen importlib._bootstrap_external>:361(_get_cached)
       89    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:37(_relax_case)
       35    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:393(_check_name_wrapper)
       35    0.001    0.000    0.003    0.000 <frozen importlib._bootstrap_external>:430(_validate_bytecode_header)
       35    0.001    0.000    0.011    0.000 <frozen importlib._bootstrap_external>:485(_compile_bytecode)
       70    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:52(_r_long)
       43    0.001    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:524(spec_from_file_location)
      453    0.005    0.000    0.016    0.000 <frozen importlib._bootstrap_external>:57(_path_join)
      453    0.006    0.000    0.009    0.000 <frozen importlib._bootstrap_external>:59(<listcomp>)
       70    0.001    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:63(_path_split)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:669(create_module)
     35/4    0.001    0.000    0.149    0.037 <frozen importlib._bootstrap_external>:672(exec_module)
       35    0.002    0.000    0.024    0.001 <frozen importlib._bootstrap_external>:743(get_code)
      187    0.001    0.000    0.005    0.000 <frozen importlib._bootstrap_external>:75(_path_stat)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:800(__init__)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:825(get_filename)
       35    0.002    0.000    0.003    0.000 <frozen importlib._bootstrap_external>:830(get_data)
       35    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:840(path_stats)
       63    0.001    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:85(_path_is_mode_type)
        8    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:908(__init__)
        8    0.000    0.000    0.006    0.001 <frozen importlib._bootstrap_external>:919(create_module)
        8    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:927(exec_module)
       58    0.000    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:94(_path_isfile)
        5    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:99(_path_isdir)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 <string>:5(DictionaryWithPredicate)
        1    0.000    0.000    0.000    0.000 TextSummaryExtractor.py:19(SummaryTool)
        1    0.000    0.000    0.000    0.000 TextSummaryExtractor.py:3(<module>)
        1    0.000    0.000    0.000    0.000 __future__.py:48(<module>)
        1    0.000    0.000    0.000    0.000 __future__.py:78(_Feature)
        9    0.000    0.000    0.000    0.000 __future__.py:79(__init__)
        1    0.000    0.000    0.000    0.000 __init__.py:1(<module>)
        1    0.000    0.000    0.004    0.004 __init__.py:3(<module>)
        1    0.000    0.000    0.002    0.002 __init__.py:357(namedtuple)
        2    0.000    0.000    0.023    0.012 __init__.py:4(<module>)
        2    0.000    0.000    0.000    0.000 __init__.py:420(<genexpr>)
        2    0.000    0.000    0.000    0.000 __init__.py:422(<genexpr>)
        1    0.000    0.000    0.120    0.120 __init__.py:6(<module>)
       43    0.000    0.000    0.000    0.000 _compat_pickle.py:165(<genexpr>)
       85    0.000    0.000    0.000    0.000 _compat_pickle.py:167(<genexpr>)
        1    0.000    0.000    0.001    0.001 _compat_pickle.py:9(<module>)
       14    0.000    0.000    0.000    0.000 abc.py:9(abstractmethod)
        1    0.000    0.000    0.003    0.003 bisect.py:1(<module>)
        1    0.000    0.000    0.000    0.000 codecs.py:347(__init__)
        1    0.000    0.000    0.000    0.000 codecs.py:422(__init__)
        1    0.000    0.000    0.007    0.007 codecs.py:450(read)
        1    0.000    0.000    0.020    0.020 codecs.py:603(readlines)
        1    0.000    0.000    0.000    0.000 codecs.py:678(__init__)
        1    0.000    0.000    0.020    0.020 codecs.py:704(readlines)
        1    0.000    0.000    0.000    0.000 codecs.py:744(__enter__)
        1    0.000    0.000    0.000    0.000 codecs.py:747(__exit__)
        1    0.000    0.000    0.000    0.000 codecs.py:862(open)
        5    0.000    0.000    0.000    0.000 copy.py:66(copy)
        1    0.000    0.000    0.000    0.000 datastore.py:115(Node)
   172718    1.404    0.000    1.404    0.000 datastore.py:116(__init__)
        1    0.000    0.000    0.000    0.000 datastore.py:122(DTrie)
        1    0.000    0.000    0.000    0.000 datastore.py:126(__init__)
        1    0.000    0.000    0.000    0.000 datastore.py:14(Queue)
      222    0.003    0.000    0.058    0.000 datastore.py:140(isWord)
      222    0.012    0.000    0.055    0.000 datastore.py:146(isWordAndTrie)
    63896    4.643    0.000   18.098    0.000 datastore.py:178(add)
        1    0.000    0.000    0.000    0.000 datastore.py:236(getAllWordsIterable)
518546/63897    8.297    0.000   11.944    0.000 datastore.py:239(getAllWordsIterableHelper)
        1    0.000    0.000    0.000    0.000 datastore.py:252(RTrie)
        1    0.000    0.000    0.000    0.000 datastore.py:285(TamilTrie)
        1    0.000    0.000    0.016    0.016 datastore.py:4(<module>)
        1    0.000    0.000    0.000    0.000 datastore.py:53(Trie)
        1    0.000    0.000    0.000    0.000 datastore.py:56(__init__)
    64097    0.641    0.000    8.865    0.000 datastore.py:60(get_letters_impl)
        1    0.000    0.000   32.675   32.675 demo.py:5(<module>)
        1    0.000    0.000    0.000    0.000 dictionary.py:111(Agarathi)
        1    0.000    0.000    0.000    0.000 dictionary.py:112(__init__)
    63896    0.657    0.000   18.755    0.000 dictionary.py:139(add)
      222    0.002    0.000    0.060    0.000 dictionary.py:145(isWord)
        1    0.000    0.000    0.000    0.000 dictionary.py:151(getDictionaryPath)
    63897    0.496    0.000   12.440    0.000 dictionary.py:157(getAllWordsIterable)
        1    0.000    0.000    0.000    0.000 dictionary.py:16(Dictionary)
        1    0.000    0.000    0.000    0.000 dictionary.py:170(EmptyAgarathi)
        1    0.000    0.000    0.000    0.000 dictionary.py:174(TamilVU)
        1    0.000    0.000    0.000    0.000 dictionary.py:175(__init__)
        1    0.000    0.000    0.000    0.000 dictionary.py:178(EnglishLinux)
        1    0.000    0.000    0.000    0.000 dictionary.py:189(VatamozhiMonierWilliams)
        1    0.000    0.000    0.000    0.000 dictionary.py:193(ParallelDictionary)
        1    0.000    0.000    0.000    0.000 dictionary.py:210(Madurai)
        1    0.000    0.000    0.000    0.000 dictionary.py:217(Wikipedia)
        1    0.000    0.000    0.000    0.000 dictionary.py:225(DictionaryBuilder)
        1    0.000    0.000   32.416   32.416 dictionary.py:226(create)
        1    0.000    0.000    0.023    0.023 dictionary.py:4(<module>)
        1    0.279    0.279   12.719   12.719 dictionary.py:47(getSize)
        1    0.608    0.608   19.697   19.697 dictionary.py:58(loadWordFile)
        1    0.000    0.000    0.000    0.000 dictionary.py:71(SimpleDictionary)
        1    0.000    0.000    0.014    0.014 encode2unicode.py:23(<module>)
        1    0.005    0.005    0.005    0.005 encode2utf8.py:24(<module>)
      166    0.001    0.000    0.003    0.000 enum.py:265(__call__)
      166    0.001    0.000    0.002    0.000 enum.py:515(__new__)
       33    0.000    0.000    0.000    0.000 enum.py:592(name)
        2    0.000    0.000    0.000    0.000 enum.py:597(value)
        2    0.000    0.000    0.001    0.001 enum.py:758(_missing_)
        2    0.000    0.000    0.001    0.001 enum.py:765(_create_pseudo_member_)
        9    0.000    0.000    0.002    0.000 enum.py:795(__or__)
       74    0.001    0.000    0.003    0.000 enum.py:801(__and__)
       11    0.000    0.000    0.000    0.000 enum.py:820(_high_bit)
        2    0.000    0.000    0.001    0.001 enum.py:837(_decompose)
        2    0.000    0.000    0.001    0.000 enum.py:855(<listcomp>)
        5    0.000    0.000    0.000    0.000 enum.py:866(<lambda>)
       15    0.000    0.000    0.000    0.000 enum.py:872(_power_of_two)
       14    0.000    0.000    0.005    0.000 hashlib.py:116(__get_openssl_constructor)
        1    0.000    0.000    0.010    0.010 hashlib.py:54(<module>)
        8    0.000    0.000    0.004    0.001 hashlib.py:73(__get_builtin_constructor)
        1    0.000    0.000    0.000    0.000 ipaconvert.py:24(<module>)
        1    0.000    0.000    0.003    0.003 numeral.py:5(<module>)
        1    0.000    0.000    0.000    0.000 orddic.py:5(<module>)
        1    0.000    0.000    0.005    0.005 pickle.py:181(<listcomp>)
        1    0.000    0.000    0.000    0.000 pickle.py:184(_Framer)
        1    0.000    0.000    0.000    0.000 pickle.py:220(_Unframer)
        1    0.000    0.000    0.013    0.013 pickle.py:24(<module>)
        1    0.000    0.000    0.000    0.000 pickle.py:345(_Pickler)
        1    0.000    0.000    0.000    0.000 pickle.py:64(PickleError)
        1    0.000    0.000    0.000    0.000 pickle.py:68(PicklingError)
        1    0.000    0.000    0.000    0.000 pickle.py:75(UnpicklingError)
        1    0.000    0.000    0.000    0.000 pickle.py:88(_Stop)
        1    0.000    0.000    0.000    0.000 pickle.py:986(_Unpickler)
        1    0.000    0.000    0.000    0.000 posixpath.py:102(split)
        1    0.000    0.000    0.000    0.000 posixpath.py:329(normpath)
        1    0.000    0.000    0.000    0.000 posixpath.py:367(abspath)
        2    0.000    0.000    0.000    0.000 posixpath.py:39(_get_sep)
        1    0.000    0.000    0.000    0.000 posixpath.py:62(isabs)
        1    0.000    0.000    0.000    0.000 pprint.py:35(<module>)
        1    0.000    0.000    0.000    0.000 pprint.py:72(_safe_key)
        1    0.000    0.000    0.000    0.000 pprint.py:98(PrettyPrinter)
        1    0.000    0.000   32.678   32.678 profile:0(<code object <module> at 0x102c77810, file "demo.py", line 5>)
        0    0.000             0.000          profile:0(profiler)
        1    0.000    0.000    0.000    0.000 qwertykbd.py:9(<module>)
        1    0.000    0.000    0.021    0.021 random.py:38(<module>)
        1    0.000    0.000    0.000    0.000 random.py:663(SystemRandom)
        1    0.000    0.000    0.000    0.000 random.py:71(Random)
        1    0.000    0.000    0.000    0.000 random.py:87(__init__)
        1    0.000    0.000    0.000    0.000 random.py:96(seed)
      102    0.001    0.000    0.004    0.000 re.py:169(match)
        2    0.000    0.000    0.020    0.010 re.py:231(compile)
        1    0.000    0.000    0.000    0.000 re.py:249(escape)
      104    0.001    0.000    0.022    0.000 re.py:286(_compile)
        1    0.000    0.000    0.000    0.000 regexp.py:5(<module>)
        1    0.000    0.000    0.000    0.000 resources.py:10(<listcomp>)
        1    0.000    0.000    0.000    0.000 resources.py:13(get_data_dir)
        1    0.000    0.000    0.000    0.000 resources.py:17(get_data_dictionaries)
        1    0.000    0.000    0.000    0.000 resources.py:28(get_data_categories)
       14    0.000    0.000    0.000    0.000 resources.py:42(mk_path)
        1    0.000    0.000    0.001    0.001 resources.py:5(<module>)
        1    0.000    0.000    0.000    0.000 resources.py:9(_make_dict_with_path)
        1    0.000    0.000    0.000    0.000 santhirules.py:4(<module>)
      164    0.001    0.000    0.002    0.000 sre_compile.py:102(fixup)
        8    0.000    0.000    0.005    0.001 sre_compile.py:223(_compile_charset)
        8    0.002    0.000    0.005    0.001 sre_compile.py:250(_optimize_charset)
        5    0.000    0.000    0.000    0.000 sre_compile.py:376(_mk_bitmap)
        5    0.000    0.000    0.000    0.000 sre_compile.py:378(<listcomp>)
        4    0.000    0.000    0.000    0.000 sre_compile.py:381(_bytes_to_codes)
        4    0.000    0.000    0.000    0.000 sre_compile.py:388(_simple)
        2    0.000    0.000    0.000    0.000 sre_compile.py:414(_get_literal_prefix)
        2    0.000    0.000    0.000    0.000 sre_compile.py:441(_get_charset_prefix)
        3    0.000    0.000    0.001    0.000 sre_compile.py:482(_compile_info)
        6    0.000    0.000    0.000    0.000 sre_compile.py:539(isstring)
        3    0.000    0.000    0.012    0.004 sre_compile.py:542(_code)
        3    0.000    0.000    0.022    0.007 sre_compile.py:557(compile)
     16/3    0.001    0.000    0.011    0.004 sre_compile.py:64(_compile)
       16    0.000    0.000    0.000    0.000 sre_parse.py:111(__init__)
       15    0.000    0.000    0.000    0.000 sre_parse.py:159(__len__)
       48    0.000    0.000    0.001    0.000 sre_parse.py:163(__getitem__)
        4    0.000    0.000    0.000    0.000 sre_parse.py:167(__setitem__)
       18    0.000    0.000    0.000    0.000 sre_parse.py:171(append)
    24/11    0.000    0.000    0.001    0.000 sre_parse.py:173(getwidth)
        3    0.000    0.000    0.000    0.000 sre_parse.py:223(__init__)
      329    0.001    0.000    0.001    0.000 sre_parse.py:232(__next)
       51    0.000    0.000    0.000    0.000 sre_parse.py:248(match)
      270    0.002    0.000    0.003    0.000 sre_parse.py:253(get)
        4    0.000    0.000    0.000    0.000 sre_parse.py:266(getuntil)
       24    0.000    0.000    0.000    0.000 sre_parse.py:285(tell)
        1    0.000    0.000    0.000    0.000 sre_parse.py:287(seek)
        3    0.000    0.000    0.000    0.000 sre_parse.py:342(_escape)
      8/3    0.000    0.000    0.009    0.003 sre_parse.py:407(_parse_sub)
     11/3    0.002    0.000    0.009    0.003 sre_parse.py:470(_parse)
        3    0.000    0.000    0.000    0.000 sre_parse.py:76(__init__)
       14    0.000    0.000    0.000    0.000 sre_parse.py:81(groups)
        3    0.000    0.000    0.001    0.000 sre_parse.py:828(fix_flags)
        4    0.000    0.000    0.000    0.000 sre_parse.py:84(opengroup)
        3    0.000    0.000    0.010    0.003 sre_parse.py:844(parse)
        4    0.000    0.000    0.000    0.000 sre_parse.py:96(closegroup)
        1    0.000    0.000    0.021    0.021 string.py:15(<module>)
        1    0.000    0.000    0.000    0.000 string.py:169(Formatter)
        1    0.000    0.000    0.000    0.000 string.py:55(_TemplateMetaclass)
        1    0.000    0.000    0.020    0.020 string.py:65(__init__)
        1    0.000    0.000    0.000    0.000 string.py:77(Template)
        1    0.001    0.001    0.002    0.002 tace16.py:358(<listcomp>)
        1    0.000    0.000    0.002    0.002 tace16.py:4(<module>)
        1    0.000    0.000    0.000    0.000 tamil99kbd.py:11(<module>)
        1    0.000    0.000    0.000    0.000 transliteration.py:23(<module>)
        1    0.001    0.001    0.002    0.002 tscii.py:13(<module>)
      256    0.001    0.000    0.001    0.000 tscii.py:16(<lambda>)
        1    0.000    0.000    0.000    0.000 tweetparser.py:12(TweetParser)
        1    0.000    0.000    0.000    0.000 tweetparser.py:60(TamilTweetParser)
        1    0.000    0.000    0.004    0.004 tweetparser.py:9(<module>)
       35    0.000    0.000    0.000    0.000 types.py:135(__get__)
        1    0.000    0.000    0.147    0.147 typographical.py:14(<module>)
    632/1    0.026    0.000    0.041    0.041 typographical.py:20(oridam_generate_patterns)
        1    0.001    0.001    0.102    0.102 typographical.py:50(corrections)
        1    0.000    0.000    0.000    0.000 unicode2encode.py:25(<module>)
        1    0.000    0.000    0.003    0.003 unicode2ipa.py:23(<module>)
        1    0.003    0.003    0.031    0.031 utf8.py:11(<module>)
        1    0.000    0.000    0.000    0.000 utf8.py:159(<listcomp>)
      288    0.001    0.000    0.001    0.000 utf8.py:234(uyir_len)
      288    0.001    0.000    0.001    0.000 utf8.py:237(mei_len)
      288    0.003    0.000    0.005    0.000 utf8.py:274(uyirmei_constructed)
    98518    1.125    0.000    1.940    0.000 utf8.py:303(<lambda>)
        4    0.000    0.000    0.000    0.000 utf8.py:384(_make_set)
    64097    4.222    0.000    8.224    0.000 utf8.py:393(get_letters)
        1    0.000    0.000    0.000    0.000 utf8.py:758(CacheGetLettersMixin)
        1    0.000    0.000    0.000    0.000 utf8.py:760(__init__)
    64118    0.895    0.000   10.059    0.000 utf8.py:767(get_letters)
        1    0.000    0.000    0.000    0.000 wordutils.py:310(DictionaryFixedWordList)
        1    0.000    0.000    0.029    0.029 wordutils.py:4(<module>)

Basically, this confirms solthiruthi, and similar search based spellers, as a computational problem for Tamil spell checkers claimed in our paper. Performance is all it takes to make the results better, more accurate and faster.