For starters, you can use setShaderInputs(a=1, b=2) to set multiple shader inputs at once, it is more efficient, or setShaderInputs(**somedict).
One method that is used by eg. RenderPipeline is to use an array input for many values, and then pass a PTA to the setShaderInput call, after which you can then modify values in the PTA without an explicit setShaderInput call to update them. This would also allow you to use the index value specified on the vertex level to index into the appropriate set. However, this might make shader code less readable.
The most efficient way to update many inputs is a Uniform Buffer Object, but that’s introduced in OpenGL 3.1, and you are targeting OpenGL 3.0 — and besides, they are not yet fully exposed in Panda, although I could work on it for anyone who wanted to use them.