I'm trying to get started with Numba, and having gotten it installed my first experience was with the following bit of code:
from numba import autojit
@autojit
def trial(a,b):
return a+b
trial(1,1)
I get the following error, which tells me autojit is misinterpreting a variable type, but doesn't tell me much more. (The same happens with other ways of wrapping the function, like @jit(...)
for example.) The problem is similar to this, but is not operation-specific: it happens regardless of what the function is doing or how simple it is (as the example shows). Any suggestions for what the problem might be? Running on Ubuntu 12.04 and installed according to the instructions on Github.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-1-653102b59b98> in <module>()
5 return a+b
6
----> 7 trial(1,1)
/usr/local/lib/python2.7/dist-packages/numba/numbawrapper.so in numba.numbawrapper._NumbaSpecializingWrapper.__call__ (numba/numbawrapper.c:3934)()
/usr/local/lib/python2.7/dist-packages/numba/wrapping/compiler.pyc in compile_from_args(self, args, kwargs)
67 def compile_from_args(self, args, kwargs):
68 signature = self.resolve_argtypes(args, kwargs)
---> 69 return self.compile(signature)
70
71 def compile(self, signature):
/usr/local/lib/python2.7/dist-packages/numba/wrapping/compiler.pyc in compile(self, signature)
86 env=self.env, func_ast=self.ast, **self.flags)
87
---> 88 compiled_function = dec(self.py_func)
89 return compiled_function
90
/usr/local/lib/python2.7/dist-packages/numba/decorators.pyc in _jit_decorator(func)
222 sig, lfunc, wrapper = compile_function(env, func, argtys,
223 restype=return_type,
--> 224 nopython=nopython, func_ast=func_ast, **kwargs)
225 return numbawrapper.create_numba_wrapper(func, wrapper, sig, lfunc)
226
/usr/local/lib/python2.7/dist-packages/numba/decorators.pyc in compile_function(env, func, argtypes, restype, func_ast, **kwds)
131 assert kwds.get('llvm_module') is None, kwds.get('llvm_module')
132
--> 133 func_env = pipeline.compile2(env, func, restype, argtypes, func_ast=func_ast, **kwds)
134
135 function_cache.register_specialization(func_env)
/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in compile2(env, func, restype, argtypes, ctypes, compile_only, func_ast, **kwds)
142 pipeline = env.get_pipeline(kwds.get('pipeline_name', None))
143 func_ast.pipeline = pipeline
--> 144 post_ast = pipeline(func_ast, env)
145 func_signature = func_env.func_signature
146 symtab = func_env.symtab
/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in __call__(self, ast, env)
189
190 if self.is_composed:
--> 191 ast = self.transform(ast, env)
192 else:
193 try:
/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in transform(self, ast, env)
654 stage_tuple = (stage, utils.ast2tree(ast))
655 logger.debug(pprint.pformat(stage_tuple))
--> 656 ast = stage(ast, env)
657 return ast
658
/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in _stage(ast, env)
639 def _stage(ast, env):
640 stage_obj = getattr(env.pipeline_stages, name)
--> 641 return _check_stage_object(stage_obj)(ast, env)
642 _stage.__name__ = name
643 stage = _stage
/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in __call__(self, ast, env)
192 else:
193 try:
--> 194 ast = self.transform(ast, env)
195 except error.NumbaError as e:
196 func_env = env.translation.crnt
/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in transform(self, ast, env)
551 **func_env.kwargs)
552
--> 553 func_env.translator.translate()
554 func_env.lfunc = func_env.translator.lfunc
555 return ast
/usr/local/lib/python2.7/dist-packages/numba/codegen/translate.pyc in translate(self)
327 self.lfunc = None
328 try:
--> 329 self.setup_func()
330 if isinstance(self.ast, ast.FunctionDef):
331 # Handle the doc string for the function
/usr/local/lib/python2.7/dist-packages/numba/codegen/translate.pyc in setup_func(self)
304
305 # TODO: Put current function into symbol table for recursive call
--> 306 self.setup_return()
307
308 if self.have_cfg:
/usr/local/lib/python2.7/dist-packages/numba/codegen/translate.pyc in setup_return(self)
471 llvm_ret_type = self.func_signature.return_type.to_llvm(self.context)
472 self.return_value = self.builder.alloca(llvm_ret_type,
--> 473 "return_value")
474
475 # All non-NULL object emporaries are DECREFed here
/usr/local/lib/python2.7/dist-packages/llvm/core.pyc in alloca(self, ty, size, name)
2303
2304 def alloca(self, ty, size=None, name=""):
-> 2305 sizeptr = size._ptr if size else None
2306 return _make_value(self._ptr.CreateAlloca(ty._ptr, sizeptr, name))
2307
AttributeError: 'str' object has no attribute '_ptr'
Edit: In response to @JoshAdel, I used the instructions for "Custom Python Environments" on the Github page, with my LLVM_BUILD_DIR=/opt/
. From the CHANGE_LOG in the repo, I take the version I installed to be 0.11. If I run the example you provide, I get
from numba import autojit, typeof
@autojit
def trial(a,b):
print typeof(a), typeof(b)
return a+b
trial(1,1)
to which
File "<unknown file>", line 2
print typeof(a), typeof(b)
^
SyntaxError: invalid syntax
If I remove the @autojit
it works ok. That it throws a SyntaxError
with @autojit
invoked is certainly a clue, but I'm new enough to this that I couldn't say what...
Also, in case it matters, I'm running this in an IPython Notebook so that numpy, scipy, and matplotlib are automatically loaded on startup.