I'm not even checking your math, because that's 4.8 months to crack one user's password. A spectacular win compared to "salted hashes".
Unless, of course, you salt them (which would turn it into 4.8 months to break all the common passwords in a table, building a rainbow table with the salt taken in mind - the only situation in which you're spending 4.8 months per user is if they're each salted differently, for example with the username)- but the article doesn't suggest salting bcrypt, so I'm ignoring that.
>> BCrypt::Password.create("hi,mom", :cost => 10)
=> "$2a$10$L/c.1uoZSh3oaU1fLrnYK.yyU4PiJXsIAzN22qnbU41liyLn5/of 2"
>> BCrypt::Password.create("hi,mom", :cost => 10)
=> "$2a$10$3F0BVk5t8/aoS.3ddaB3l.fxg5qvafQ9NybxcpXLzMeAt.nVWn.NO"
>> BCrypt::Password.create("hi,mom", :cost => 10)
=> "$2a$10$VEVmGHy4F4XQMJ3eOZJAUeb.MedU0W10pTPCuf53eHdKJPiSE8sMK"
Despite the pages and pages and pages and pages of conversation about how to select and format "salts", adding random nonces to hashes is not one of the world's great CS problems.Or did you make a mistake and the cost factors are supposed to different ?
The documentation for py-bcrypt ( http://www.mindrot.org/projects/py-bcrypt/) doesn't explain what happens, but shows use is very very easy.
EDIT: current guess is that searching for the salt that was used might be part of what makes it hard.