Let me say this up front - pymel is an impressive project. The scope of the work is huge, and Chad executed it really well. His releases are solid, having all the unit tests and whatnot is a huge amount of work. I’ve learnt alot from reading his code.
Having said that…
I came to pymel late in the game. I had heard of it, but initially didn’t see the point of it. After all, I was super familiar with mel, and while syntactically different, maya’s python bindings were basically just the same api as mel. At least at first glance.
I wrote my initial thoughts down after using pymel for about a month in this post: http://www.macaronikazoo.com/?p=224
Anyway after using it for a few months I eventually moved away from it completely. I wrote up my thoughts on why it didn’t work for me here:
http://www.macaronikazoo.com/?p=271
But basically for me it comes down to two things - its really inconvenient to use in just part of your code base, so using it is an all or nothing affair*.
And secondly its really slow.
These two reasons mean that using it creates sub-optimal code.
*to go into more detail - instances of the PyNode class cannot be passed to maya.cmds functions - they need to be cast as a string first. So if you have a function/class based on pymel that calls into one that isn’t, one of them needs to handle this conversion. Now if the caller does the conversion then when the callee gets re-written in pymel there is no clear way to fix up this dependency.
Similarly if the callee does the conversion, then you end up having to edit all the leaf code you touch just to convert a script to use pymel. Both of these options are just horrible in my opinion. The last option I guess is to re-write your entire codebase to work with pymel - but then you’ll almost certainly bump into the performance problem.
Anyway. Thats my take on pymel.