In Python, every time you get an attribute like my_object.attribute, quite a bit of code has to be run. In pure Python there is the getattr and property machinery. In Blender it can be actually worse: The C API may decide to copy stuff, and/or allocate memory for temporary structures to return as “attribute”. Therefore, you have to treat the dot operator as expensive operation, and it may be the same with the square brackets. The latter can also involve a lot of non-obvious work, if it is used on a Blender object.
What is worse, whenever this is done in a loop, the allocated objects accumulate, and the garbage collector eventually has to get rid of them. So you may want to turn off the GC temporarily.
I can’t recommend Cython to plugin developers currently. It’s a great tool, and Blender would benefit greatly from using it, but it’s not going to happen until the core developers adopt it, and they probably would have to adopt Conda as a packaging tool, also. In any case, Cython will not help you a lot if you access Python API/Blender API functions, but the way to go would be to access Blender’s internal memory structures directly.
On the other hand, maybe it is time to create a numpy-based Mesh API…