>>> d = {1:0, 2:0, 3:1}
>>> all(x==0 for x in d.values())
False
>>> d[3] = 0
>>> all(x==0 for x in d.values())
True
No matter whether you use any or all, the evaluation will be lazy. all returns False on the first falsy value it encounters. any returns True on the first truthy value it encounters.
Thus, not any(d.values()) will give you the same result for the example dictionary I provided. It is a little shorter than the all version with the generator comprehension. Personally, I still like the all variant better because it expresses what you want without the reader having to do the logical negation in his head.
There's one more problem with using any here, though:
>>> d = {1:[], 2:{}, 3:''}
>>> not any(d.values())
True
The dictionary does not contain the value 0, but not any(d.values()) will return True because all values are falsy, i.e. bool(value) returns False for an empty list, dictionary or string.
In summary: readability counts, be explicit, use the all solution.