Hi gngdb, the recursive function you are using has an overhead for concatenation and slicing. Hence, for reducing smaller lists, the naive reduce may be faster. However, for list lengths of 128, I got the following result.
functools:
  CPU:  2.2555802155067415
  GPU:  3.1399718035379047
recursive:
  CPU:  10.128527292804142
  GPU:  1.773943289081565

So your batching method scales better then the naive reduce.