As Georgios pointed out on the mailinglist conditions have a bad performance.
It looks like OrderedDict is the culprit, whose instanciation sadly seems to be very expensive. I introduced a custom object for condition values, which mimics a dictionary and is a drop-in replacement as far as the tests are concerned.
The benchmark Georgios added to his mail takes 6.76 seconds on my machine. This changeset drops the runtime to 2.82 seconds, which should be enough to outpace SimPy 2.
This is one of many solutions. The result of a condition may also be a list of (event, value) tuples, which is easily convertible to a dict or the list of values only with a little bit more work on the user-side. I would be fine with that solution too, but it will of course break the API.
Without having taken a look at your code – the performance improvement looks nice and and a list of tuples as a replacement for the results dict also sounds nice. I often had the use case "I’d like the value of the first result“ wich would now be results – no need to store the event in a separate name just to exit its value. :-)
There's also a problem with using lists, we either sacrify dictionary access or value expansion. If we use list of (event, value) tuples, the user can easily convert it to a dictionary dict(results). This will make expansion difficult, e.g. a, b, c = list(zip(*(yield env.all_of(events)))
The other way around, using a tuple (events, values) simplifies expansion, but make conversion to a dict cumbersome.